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 格式正确。至少它需要匹配你的代码,所以它需要一个结束 &lt;group/&gt; 标记和一个根元素。 @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 标记的子项和孙项的主要内容,如果未能解决你的问题,请参考以下文章

在 @INC 中找不到 XML/LibXML.pm

XML :: LibXML无法通过HTTPS验证可用的DTD

在 Perl 中解析 HTML 和 CSS 都有哪些好方法?

使用 XML::LibXML 遍历节点

为啥即使我禁用 XML::LibXML 仍会出现打印错误?

从 perl 脚本中提取用户名