как отделить строки от нисходящих узлов XML, получаемых с помощью функции to_literal из модуля xml :: xmllib в perl? - PullRequest
0 голосов
/ 22 марта 2012

У меня есть XML-структура примерно такая:

<A>
  <B>One</B>
  <C>Two</C>
  <D>
     <E>Three</E>
     <F>Four</F>
     ...
  </D>
  ...
</A>

Структура большая, сложная, и я знаю только начало, т. Е. '/ A'

и код в Perl, как это:

use XML::LibXML;
my $parser = XML::LibXML->new();
my $xml = $parser->parse_file($file);
print $xml->find('/A')->to_literal;

дает мне результат:

OneTwoThreeFour

Если я использую код вроде:

print join (" ", map { $_->to_literal } $xml->findnodes('/A/descendant::*'));

Я получаю:

One Two ThreeFour Three Four 

Мне нужны уникальные и разрозненные значения со знаками пространства, т. Е .:

One Two Three Four

Как это сделать?

1 Ответ

2 голосов
/ 22 марта 2012

Сводка XML :: LibXML :: Node дает подсказку:

@nodes = $node->findnodes( $xpath_expression );
$result = $node->find( $xpath );

Поэтому используйте метод findnodes, чтобы получить список результатов. Кроме того, вы хотите выбрать дочерние элементы элемента A, измените выражение XPath так, чтобы оно соответствовало:

my @children_literal_text = map { $_->to_literal } $xml->findnodes('/A/*');
# ('One', 'Two')
...