BeautifulSoup.findAll () в Perl - PullRequest
       42

BeautifulSoup.findAll () в Perl

0 голосов
/ 18 ноября 2009

Мне нужно вытащить все элементы NodeGroup из файла XML:

<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 и XML-модули Perl, поэтому я использовал XML :: Simple XMLIn, рекурсивно просматривая каждый ключ хеша, проверяя, было ли значение хешем, проверял, было ли это хеш NodeGroup и т. Д.

Я бы подумал, что в одном из XML-модулей Perl есть что-то вроде soup.findAll (), но я не могу его найти. Как мне сделать "soup.findAll ('nodegroups')" в Perl?

Ответы [ 4 ]

3 голосов
/ 18 ноября 2009

Чтобы прояснить ответ Рэндала, я думаю, вам нужен API XML::LibXML::XPathContext, предоставляемый дистрибутивом XML::LibXML:

my $xpath = XML::LibXML::XPathContext->new($document);
for my $node ( $xpath->find('//NodeGroup') { ... }
1 голос
/ 18 ноября 2009

Использование 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. См. Также раздел caveats в документации.

1 голос
/ 18 ноября 2009

XML :: DOM имеет getElementsByTagName (как и XML :: LibXML :: DOM и XML :: GDOME), который работает как функция DOM с тем же именем.

1 голос
/ 18 ноября 2009

В Perl нет модуля "XML". В пространстве имен XML:: много модулей. Мой любимый XML::LibXML, но для чего-то такого простого, вы можете даже использовать HTML::Parser в «xml-mode».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...