2013-01-31 88 views
2

我有以下的PHP和XML:PHP,XPath和SimpleXML的 - 的XPath不工作

$XML = <<<XML 
<items> 
    <item id="12"> 
     <name>Item A</name> 
    </item> 
    <item id="34"> 
     <name>Item B</name> 
    </item> 
    <item id="56"> 
     <name>Item C</name> 
    </item> 
</items> 
XML; 


$simpleXmlEle = new SimpleXMLElement($XML); 

print_r($simpleXmlEle->xpath('./item[1]')); 
print "- - - - - - -\n"; 
print_r($simpleXmlEle->xpath('./item[2][@id]')); 
print "- - - - - - -\n"; 
print_r($simpleXmlEle->xpath('./item[1]/name')); 

我能够访问ID这样

$simpleXmlEle->items->item[0]['id'] 

由于它是一个动态的应用xpath在运行时以字符串形式提供,所以我相信我应该使用xpath。

上面PHP生产:

PHP:

Array 
(
    [0] => SimpleXMLElement Object 
     (
      [@attributes] => Array 
       (
        [id] => 12 
       ) 

      [name] => Item A 
     ) 

) 
- - - - - - - 
Array 
(
    [0] => SimpleXMLElement Object 
     (
      [@attributes] => Array 
       (
        [id] => 34 
       ) 

      [name] => Item B 
     ) 

) 
- - - - - - - 
Array 
(
    [0] => SimpleXMLElement Object 
     (
     ) 

) 

我理解的第一输出,但第2个输出内部的整体元件被返回,而不是仅仅的属性。
1)有什么想法为什么?

而且最后一个项目是空
2)这是为什么,什么是正确的XPath?

我的目标是第二个和第三个输出为:34(第二元素的id属性的值)项目A(只是第一个元素的名称)。

回答

2

见下:

// name only 
$name = $simpleXmlEle->xpath("./item[1]/name"); 
echo $name[0], PHP_EOL; 

// id only 
$id = $simpleXmlEle->xpath("./item[2]/@id"); 
echo $id[0], PHP_EOL; 

打印:

Array ([0] => SimpleXMLElement Object ([0] => Item A)) 
Array ([0] => SimpleXMLElement Object ([@attributes] => Array ([id] => 34))) 

确保您请勿做:

print_r($objSimpleXML->xpath("//item[1]/name")); 

据//返回与所有元素的文档这个名字,所以如果有更深层次上的item元素,那么它的VA lue也被返回,这是不希望的。

希望帮助

+0

尝试这样做,它的作品,感谢 –

+0

以及@DamienPyseek话,不要忘了接受的答案 – Alex

+0

已经做到了现在的感谢 –