XML::LibXML :在 perl 中提取 xml 标记的子项和孙项
Posted
技术标签:
【中文标题】XML::LibXML :在 perl 中提取 xml 标记的子项和孙项【英文标题】:XML::LibXML : To extract child and granchildren of a xml tag in perl 【发布时间】:2021-06-26 05:57:42 【问题描述】: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>
如何访问 group name = "stdcell_globalsubtypes" 的所有子节点和孙节点,而不必使用 getChildrenByTagName("cell") 解析每个子节点。
我需要解析这个 xml 数据并将其作为 %hash = ('1'=>a,'2'=>b,'3'=>c,'4'=>d, '5'=>e)
是否有任何API可以获取所有子节点和子子节点? 如果没有,我该如何递归呢?
提前致谢:)
【问题讨论】:
html 与 XML 不同,不应使用 XML 库来解析 HTML。此外,大多数库不会解析格式不正确的 XML。格式良好的 XML 文件只有一个根标记。您的输入将组和单元格都作为根标签。 你到底要做什么?无论它们在层次结构中的哪个位置,都将它们作为一个列表获取? // 请edit您的问题并使 HTML/XML 格式正确。至少它需要匹配你的代码,所以它需要一个结束<group/>
标记和一个根元素。
@Dhanashri P:您的脚本有编译错误。您希望在问题中提及什么输出。
使用 find
方法和适当的 XPath 表达式。
【参考方案1】:
我不是 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::LibXML :在 perl 中提取 xml 标记的子项和孙项的主要内容,如果未能解决你的问题,请参考以下文章
XML :: LibXML无法通过HTTPS验证可用的DTD