читать содержимое всех тегов XML, которые начинаются с определенной строки - PullRequest
0 голосов
/ 28 января 2019

У меня есть XML-структура, в которой я ищу написать Perl-скрипт, который считывает содержимое всех тегов, начинающихся с определенной строки.

Пример:

<tag-0>
    <tag-1>This is<tag-2>some example</tag2>text</tag-1>
    <tag-3>This is some <ice-8> more </ice-8>text</tag-3>
    <tag-4>This 
        <tag-5>is 
            <tag-6>even more</tag-6>
        </tag-5> 
        <tag-7> text</tag-7>
    </tag-4>
</tag-0>

Цель сценария - найти все узлы, которые начинаются с <tag-[num]> и содержат вложенный <tag-[num]>.Я не знаком с Perl, поэтому как мне читать содержимое «динамического» тега и проверять наличие более динамических вложенных тегов?

В приведенном выше примере я хотел бы получить tag-0, tag-1, tag-4 и tag-5, которые я затем смогу дополнительно манипулировать их содержимым.

Ответы [ 2 ]

0 голосов
/ 28 января 2019

XML::LibXML - мой самый используемый модуль XML - есть много других, но этот делает практически все, что мне нужно, за счет того, что иногда он немного более многословен, чем другие модули.Далее печатаются четыре желаемых узла:

use warnings;
use strict;
use XML::LibXML;

my $dom = XML::LibXML->load_xml(string => <<'EOT');
<tag-0>
    <tag-1>This is<tag-2>some example</tag-2>text</tag-1>
    <tag-3>This is some <ice-8> more </ice-8>text</tag-3>
    <tag-4>This 
        <tag-5>is 
            <tag-6>even more</tag-6>
        </tag-5> 
        <tag-7> text</tag-7>
    </tag-4>
</tag-0>
EOT

my $expr = "*[substring(name(), 1, 4) = 'tag-']";
for my $node ( $dom->findnodes("//$expr") ) {
    my @children = $node->findnodes("./$expr");
    if (@children) {
        print $node->nodeName,"\n";
    }
}

Обратите внимание, что описание вашей проблемы немного неясно: содержит ли "вложенный <tag-[num]>" означает, что должны быть только прямые потомкирассматривается или должно <tag-0>A<x>B<tag-1>C</tag-1>D</x>E</tag-0> также вернуть tag-0?

Если это так, то вы можете изменить второе findnodes выражение на ".//$expr".

0 голосов
/ 28 января 2019

Использование Mojo :: DOM :

use strict;
use warnings;
use Mojo::DOM;

my $dom = Mojo::DOM->new->xml(1)->parse($xml);

my @tags_with_subtags = $dom->find('*')->grep(sub {
  $_->tag =~ m/\Atag-[0-9]+\z/ and $_->find('*')->grep(sub {
    $_->tag =~ m/\Atag-[0-9]+\z/
  })->size
})->each;

Каждый из результатов представляет собой объект Mojo :: DOM, который можно далее искать или манипулировать.К сожалению, CSS не подходит (насколько мне известно) для поиска динамических имен тегов, поэтому вы должны сделать это самостоятельно;было бы очень легко, если бы вместо этого были динамические атрибуты.

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