Perl XML lib получает полный xpath

Хотите вернуть полный xpath из общего xpath, который может получить несколько результатов.

Строка поиска будет примерно такой: /myXmlPath/@myValue

Содержащиеся узлы xml могут выглядеть примерно так:

<myXmlPath someAttribute="false" myValue="">
<myXmlPath someAttribute="true" myValue="">

Perl-код примерно такой:

use XML::LibXML;
use XML::XPath::XMLParser;

my $filepath =  "c:\\temp\\myfile.xml";
my $parser = XML::LibXML->new();
$parser->keep_blanks(0);
my $doc    = $parser->parse_file($filepath);

@myWarn = ('/myXmlPath/@myValue');
 foreach(@myWarn) {
   my $nodeset = $doc->findnodes($_);
        foreach my $node ($nodeset->get_nodelist) {

        my $value = $node->to_literal;
            print $_,"\n";   
            print $value," - value \n";     
            print $node," - node \n";      

                }
   }

Я хотел бы иметь возможность оценивать возвращаемые значения полного пути из файла xml. Этот код отлично работает, когда я использую его для поиска общих вещей в xpath, но было бы более идеально, если бы я мог получить другие данные из результата набора узлов.


person Bruce Allen    schedule 27.08.2015    source источник
comment
Я не совсем понимаю, что вы хотите. Не могли бы вы включить желаемый результат? Но сначала не могли бы вы исправить свой пример, чтобы он был корректным XML? (То, что вы предоставили, имеет несколько корневых узлов и незакрытых элементов.)   -  person ikegami    schedule 27.08.2015


Ответы (1)


Как сказал Икегами, я не совсем уверен, что вам нужно, поэтому я как бы разработал метод дробовика для всего, что мог интерпретировать ваш вопрос.

use strict;
use warnings;

use XML::LibXML;

use v5.14;

my $doc = XML::LibXML->load_xml(IO => *DATA);

say "Get the full path to the node";
foreach my $node ($doc->findnodes('//myXmlPath/@myValue')) {
    say "\t".$node->nodePath();
}

say "Get the parent node of the attribute by searching";
foreach my $node ($doc->findnodes('//myXmlPath[./@myValue="banana"]')) {
    say "\t".$node->nodePath();
    my ($someAttribute, $myValue) = map { $node->findvalue("./$_") } qw (@someAttribute @myValue);
    say "\t\tsomeAttribute: $someAttribute";
    say "\t\tmyValue: $myValue";
}

say "Get the parent node programatically";
foreach my $attribute ($doc->findnodes('//myXmlPath/@myValue')) {
    my $element = $attribute->parentNode;
    say "\t".$element->nodePath();
}


__DATA__
<document>
<a>
  <b>
    <myXmlPath someAttribute="false" myValue="apple" />
  </b>
  <myXmlPath someAttribute="false" myValue="banana" />
</a>
</document>

Что будет производить:

Get the full path to the node
    /document/a/b/myXmlPath/@myValue
    /document/a/myXmlPath/@myValue
Get the parent node of the attribute by searching
    /document/a/myXmlPath
        someAttribute: false
        myValue: banana
Get the parent node programatically
    /document/a/b/myXmlPath
    /document/a/myXmlPath
person Tim Tom    schedule 28.08.2015
comment
Извиняюсь за то, что вопрос недостаточно ясен, но вы поняли его более или менее. Я действительно ищу nodePath() найденного общего элемента. /xmlLevel1/xmlLevel2/xmlLevel3/xmlLevel4[@name='something']/@enableSomething /xmlLevel1/xmlLevel2[1]/xmlLevel3/xmlLevel4[3] /xmlLevel1/xmlLevel2[2]/xmlLevel3/xmlLevel4[3] - person Bruce Allen; 30.08.2015