2015-08-27 2 views
0

Глядя, чтобы вернуть полный xpath из общего xpath, который может захватить несколько результатов.Perl XML lib get full 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, но был бы более идеален, если бы мог получить другие данные из результата набора узлов.

+0

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

ответ

1

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

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 
+0

Извините, что вопрос недостаточно ясен, но вы получили его более или менее. Я действительно ищу узел nodePath() найденного общего элемента./XmlLevel1/xmlLevel2/xmlLevel3/xmlLevel4 [@ имя = 'что-то']/@ enableSomething /xmlLevel1/xmlLevel2 [1]/xmlLevel3/xmlLevel4 [3] /xmlLevel1/xmlLevel2 [2]/xmlLevel3/xmlLevel4 [3] –

Смежные вопросы