2008-10-23 147 views
18

这里的XML代码,我的工作:XPath查询与PHP

<inventory> 
    <drink> 
     <lemonade supplier="mother" id="1"> 
      <price>$2.50</price> 
      <amount>20</amount> 
     </lemonade> 
     <lemonade supplier="mike" id="4"> 
      <price>$3.00</price> 
      <amount>20</amount> 
     </lemonade> 
     <pop supplier="store" id="2"> 
      <price>$1.50</price> 
      <amount>10</amount> 
     </pop> 
    </drink> 
</inventory> 

然后我写了一个简单的代码来练习使用XPath:

<?php 
    $xmldoc = new DOMDocument(); 
    $xmldoc->load('sample.xml'); 

    $xpathvar = new Domxpath($xmldoc); 

    $queryResult = $xpathvar->query('//lemonade/price'); 
    foreach($queryResult as $result) { 
     echo $result->textContent; 
    } 
?> 

该代码运作良好,输出所有的柠檬水价格值如预期。现在,当我改变查询字符串只选择设置为特定值的属性的元素,如

//柠檬水[供应商=“母亲”] /价格

//柠檬水[ID = “1”] /价格

它不会工作,没有输出。我究竟做错了什么?

回答

32

试试这个:

//lemonade[@id="1"]/price 

//lemonade[@supplier="mother"]/price 

没有 “@” 它看起来具有该名称,而不是属性的子元素。

6

您必须使用@符号来表示谓词中的属性,如://lemonade[@supplier="mother"]/price,就是这样。

7

这只是切线相关的,但是当您在知道该结构的文档上使用XPath时,请勿使用使用“// some-element-name”。这是一个很好的例子,但是当你用这个查询命中一个巨大的XML文件时,特别是如果后面跟着一些复杂的东西时,你会很快遇到性能问题。

库存/饮料/柠檬水[@供应商=“母亲”] /价格