2015-08-27 77 views
0

寻找从一般xpath返回可能抓取多个结果的完整xpath。Perl XML lib获取完整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] –