他們是否有任何以嵌套形式查找標簽級別的簡單方法,即沒有。具有相同標簽名稱的父元素。
注意:我打算創建子例程,如果我傳遞如下輸入的標量,它應該回傳如下所示的輸出作為標量。
我需要使用 Perl 從輸入中輸出如下所示的輸出。
輸入:
<sec>
<sec></sec>
<sec>
<sec></sec>
</sec>
</sec>
輸出應該是:
<sec level="1">
<sec level="2"></sec>
<sec level="2">
<sec level="3"></sec>
</sec>
</sec>
uj5u.com熱心網友回復:
一種方法,用于XML::LibXML從 XML 生成 DOM 樹,然后遍歷樹,將遞增級別屬性添加到匹配標簽:
#!/usr/bin/env perl
use warnings;
use strict;
use XML::LibXML;
# Recursively walk a DOM tree, and invoke callbacks on elements
sub walk_elements {
my ($node, $callbacks) = @_;
$callbacks->{pre}->($node) if $node->nodeType == XML_ELEMENT_NODE;
for my $child ($node->childNodes) {
walk_elements($child, $callbacks);
}
$callbacks->{post}->($node) if $node->nodeType == XML_ELEMENT_NODE;
}
sub add_levels {
my ($xml, $tagname) = @_;
my $dom = XML::LibXML->load_xml(string => $xml);
my $level = 1;
walk_elements($dom->getDocumentElement,
{ pre => sub {
$_[0]->setAttribute('level', $level )
if $_[0]->nodeName eq $tagname
},
post => sub { $level-- if $_[0]->nodeName eq $tagname }
}
);
return $dom->toStringHTML; # Or toString for XML style tags
}
my $xml = <<EOXML;
<sec>
<sec></sec>
<sec>
<sec></sec>
</sec>
</sec>
EOXML
print add_levels($xml, 'sec');
運行此腳本輸出
<sec level="1">
<sec level="2"></sec>
<sec level="2">
<sec level="3"></sec>
</sec>
</sec>
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/316248.html
標籤:perl
上一篇:是使用“||”在禁止子串搜索中?
