XML: получить только некоторые дочерние узлы узла - PullRequest
0 голосов
/ 28 ноября 2018

Я хочу пройти через две сессии в приведенном ниже xml как два отдельных узла:

abc.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<resource>    
<session>
     <parameter name="QWS" value="N1"/> 
     <parameter name="AQC" value="Y2"/>
     <parameter name="VDF" value="301"/>
     <parameter name="VTT" value="X2"/>
     <parameter name="HRR" value="Y2"/>
 </session>
 <session>
    <parameter name="ABC" value="N"/> 
     <parameter name="XYZ" value="Y"/>
     <parameter name="GHI" value="30"/>
     <parameter name="DEF" value="X"/>
     <parameter name="QQW" value="Y"/>  
    </session> 
</resource>

Однако, когда я запускаю этот код, он проходит через обе сессииоба раза:

#!/usr/bin/perl
use warnings;
use strict;
use XML::LibXML;

my $filename = 'E:/perl_files/abc.xml';
my $dom = XML::LibXML->load_xml(location => $filename);

foreach my $session ($dom->findnodes('//session'))
{
    print "In SESSION \n";
    foreach my $parameter ($session->findnodes('//parameter')) {
        my $name= $parameter->getAttribute('name');
        my $value= $parameter->getAttribute('value');
        print "Tag in session is $name with value $value\n";
    }
    print "END OF SESSION\n";   
}

Оставив меня с этим выводом:

In SESSION
Tag in session is QWS with value N1
Tag in session is AQC with value Y2
Tag in session is VDF with value 301
Tag in session is VTT with value X2
Tag in session is HRR with value Y2
Tag in session is ABC with value N
Tag in session is XYZ with value Y
Tag in session is GHI with value 30
Tag in session is DEF with value X
Tag in session is QQW with value Y
END OF SESSION
In SESSION
Tag in session is QWS with value N1
Tag in session is AQC with value Y2
Tag in session is VDF with value 301
Tag in session is VTT with value X2
Tag in session is HRR with value Y2
Tag in session is ABC with value N
Tag in session is XYZ with value Y
Tag in session is GHI with value 30
Tag in session is DEF with value X
Tag in session is QQW with value Y
END OF SESSION

Я бы хотел, чтобы вывод был

In SESSION
Tag in session is QWS with value N1
Tag in session is AQC with value Y2
Tag in session is VDF with value 301
Tag in session is VTT with value X2
Tag in session is HRR with value Y2
END OF SESSION
In SESSION
Tag in session is ABC with value N
Tag in session is XYZ with value Y
Tag in session is GHI with value 30
Tag in session is DEF with value X
Tag in session is QQW with value Y
END OF SESSION

Я использую XML :: LibXML,Какие изменения я могу сделать, чтобы дочерние узлы только одного сеанса каждый раз?Я видел ответы, используя childNodes (), но это вернет список, и я не хочу использовать grep для поиска определенного узла.

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018
//parameter

- это сокращение от

/descendant::parameter

, что означает потомка корневого узла (/) с именем parameter, но вы хотите получить потомков контекстного узла.Для этого вам нужно

descendant::parameter

, которое также можно записать как

.//parameter

Дело в том, что parameter является дочерним элементом сеансов, так что вы действительно хотите просто

child::parameter

, который также можно записать как

parameter

Окончательный код:

#!/usr/bin/perl
use warnings;
use strict;
use XML::LibXML;

my $filename = 'E:/perl_files/abc.xml';
my $dom = XML::LibXML->load_xml(location => $filename);

foreach my $session ($dom->findnodes('/resource/session'))         # <---
{
    print "In SESSION \n";
    foreach my $parameter ($session->findnodes('parameter')) {     # <---
        my $name= $parameter->getAttribute('name');
        my $value= $parameter->getAttribute('value');
        print "Tag in session is $name with value $value\n";
    }
    print "END OF SESSION\n";   
}
0 голосов
/ 28 ноября 2018

//parameter ищет parameter везде, вам нужно искать только в session, то есть в текущем узле:

    foreach my $parameter ($session->findnodes('.//parameter')) {
...