需要使用 Perl 查找 HTML/XML 嵌套标记级别
Need to finding HTML/XML nested tag levels using Perl
他们是否有任何简单的方法来查找嵌套形式的标签级别,即没有。具有相同标签名称的父元素。
注意:我打算创建一个子例程,如果我传递如下输入的标量,它应该 return 输出如下所示的标量。
我需要使用 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>
一种方法,使用 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>
他们是否有任何简单的方法来查找嵌套形式的标签级别,即没有。具有相同标签名称的父元素。
注意:我打算创建一个子例程,如果我传递如下输入的标量,它应该 return 输出如下所示的标量。
我需要使用 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>
一种方法,使用 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>