0

我需要从 XML 文件中提取所有“NodeGroup”元素:

<Database>
  <Get>
    <Data>
      <NodeGroups>
        <NodeGroup>
          <AssociateNode ConnID="6748763_2" />
          <AssociateNode ConnID="6748763_1" />
          <Data DataType="Capacity">2</Data>
          <Name>Alpha</Name>
        </NodeGroup>
        <NodeGroup>
          <AssociateNode ConnID="6748763_23" />
          <AssociateNode ConnID="6748763_7" />
          <Data DataType="Capacity">2</Data>
          <Name>Charlie</Name>
        </NodeGroup>
        <NodeGroup>
          <AssociateNode ConnID="6748763_98" />
          <AssociateNode ConnID="6748763_12" />
          <Data DataType="Capacity">2</Data>
          <Name>Papa</Name>
        </NodeGroup>
        <NodeGroup>
          <AssociateNode ConnID="6748763_8" />
          <AssociateNode ConnID="6748763_45" />
          <Data DataType="Capacity">2</Data>
          <Name>Yankee</Name>
        </NodeGroup>
      </NodeGroups>
      <System>
        ...
      </System>
    </Data>
  </Get>
</Database>

如果我可以使用 python 和 BeautifulSoup,我会解析 xml 并调用类似:

node_group_array = soup.findAll("nodegroups")

但是我使用的是 Perl 和 Perl 的 XML 模块,所以我使用了 XML::Simple 的 XMLIn,递归遍历每个散列键,检查值是否是散列,检查它是否是“NodeGroup”散列等。

我认为 Perl 的 XML 模块之一中有类似 soup.findAll() 的东西,但我找不到它。如何在 Perl 中执行“soup.findAll('nodegroups')”?

4

4 回答 4

3

为了澄清 Randal 的回答,我认为您需要发行版XML::LibXML::XPathContext提供的 API XML::LibXML

my $xpath = XML::LibXML::XPathContext->new($document);
for my $node ( $xpath->find('//NodeGroup') { ... }
于 2009-11-18T00:27:33.993 回答
1

Perl 中没有“XML”模块。命名空间中有许多模块XML::。我最喜欢的是XML::LibXML,但是对于这么简单的东西,你甚至可以HTML::Parser在“xml-mode”中使用。

于 2009-11-17T23:08:29.363 回答
1

XML::DOM 具有 getElementsByTagName(XML::LibXML::DOM 和 XML::GDOME 也是如此),其工作方式类似于同名的 DOM 函数。

于 2009-11-18T02:04:04.210 回答
1

使用XML::Simple和显示的数据文件:

#!/usr/bin/perl

use strict; use warnings;

use XML::Simple;

my $db = XMLin($ARGV[0]);
my $nodegroups = $db->{Get}{Data}{NodeGroups}{NodeGroup};

use Data::Dumper;
print Dumper $nodegroups;

您可能希望使用该ForceArray => 1选项来保证一致性,以防某些文件具有多个<NodeGroups>...</NodeGroups>部分而其他文件具有单个此类部分。

如果文件不是太大,使用XML::Simple应该没问题。另请参阅文档中的警告部分。

于 2009-11-18T03:32:59.470 回答