XML::LibXML : 在 perl 中提取 xml 标签的子代和孙代
XML::LibXML : To extract child and granchildren of a xml tag in perl
Xml数据:
<libraries>
<group name="stdcell_globalsubtypes">
<cell type="a" optional="1">
<cell type="b" optional="1">
<cell type="c" optional="1" >
<cell type="d" optional="1" >
<cell type="e" optional="1"/>
</cell>
</cell>
</cell>
</cell>
</group>
如何访问组名 = "stdcell_globalsubtypes" 的所有子节点和孙节点,而不必使用 getChildrenByTagName("cell") 解析每个子节点。
我需要解析此 xml 数据并将其哈希为 %hash = ('1'=>a,'2'=>b,'3'=>c,' 4'=>d,'5'=>e)
有没有API获取所有的子节点和子子节点?
如果没有,我该如何递归执行?
提前致谢:)
我不是 XML 专家...可能有更有效的方法来解决这个问题,但一种方法是使用递归函数
use strict;
use warnings 'FATAL', 'all';
use XML::LibXML;
sub extract_cell_types {
my $node = shift;
my @return_array;
my @cells = $node->getChildrenByTagName("cell");
for my $cell (@cells) {
my $type = $cell->getAttribute("type");
push @return_array, $type;
if ($cell->hasChildNodes) {
push @return_array, extract_cell_types($cell);
}
}
return @return_array;
}
my $doc = XML::LibXML->load_xml(string => <<'END');
<doc>
<group name="stdcell_globalsubtypes">
<cell type="a" optional="1">
<cell type="b" optional="1">
<cell type="c" optional="1" >
<cell type="d" optional="1" >
<cell type="e" optional="1"/>
</cell>
</cell>
</cell>
</cell>
</group>
</doc>
END
my $doce = $doc->getDocumentElement;
my @types;
my @groups = $doce->getChildrenByTagName("group");
for my $gn (@groups) {
if ($gn->getAttribute("name") eq "stdcell_globalsubtypes") {
push @types, extract_cell_types($gn);
}
}
print join(', ', @types) . "\n";
Xml数据:
<libraries>
<group name="stdcell_globalsubtypes">
<cell type="a" optional="1">
<cell type="b" optional="1">
<cell type="c" optional="1" >
<cell type="d" optional="1" >
<cell type="e" optional="1"/>
</cell>
</cell>
</cell>
</cell>
</group>
如何访问组名 = "stdcell_globalsubtypes" 的所有子节点和孙节点,而不必使用 getChildrenByTagName("cell") 解析每个子节点。
我需要解析此 xml 数据并将其哈希为 %hash = ('1'=>a,'2'=>b,'3'=>c,' 4'=>d,'5'=>e)
有没有API获取所有的子节点和子子节点? 如果没有,我该如何递归执行?
提前致谢:)
我不是 XML 专家...可能有更有效的方法来解决这个问题,但一种方法是使用递归函数
use strict;
use warnings 'FATAL', 'all';
use XML::LibXML;
sub extract_cell_types {
my $node = shift;
my @return_array;
my @cells = $node->getChildrenByTagName("cell");
for my $cell (@cells) {
my $type = $cell->getAttribute("type");
push @return_array, $type;
if ($cell->hasChildNodes) {
push @return_array, extract_cell_types($cell);
}
}
return @return_array;
}
my $doc = XML::LibXML->load_xml(string => <<'END');
<doc>
<group name="stdcell_globalsubtypes">
<cell type="a" optional="1">
<cell type="b" optional="1">
<cell type="c" optional="1" >
<cell type="d" optional="1" >
<cell type="e" optional="1"/>
</cell>
</cell>
</cell>
</cell>
</group>
</doc>
END
my $doce = $doc->getDocumentElement;
my @types;
my @groups = $doce->getChildrenByTagName("group");
for my $gn (@groups) {
if ($gn->getAttribute("name") eq "stdcell_globalsubtypes") {
push @types, extract_cell_types($gn);
}
}
print join(', ', @types) . "\n";