我用这个examle xml document进行练习。而且我不了解XPath中的node()函数。例如,如果我写:
$catalog = new SimpleXMLElement("cd.xml",null,true);
$elms = $catalog->xpath("//CD[23]/node()");
print_r($elms);
结果是:
Array
(
[0] => SimpleXMLElement Object
(
[@attributes] => Array
(
[id] => 24
[genre] => soul
)
[TITLE] => The dock of the bay
[ARTIST] => Otis Redding
[COUNTRY] => USA
[COMPANY] => Stax Records
[PRICE] => 7.90
[YEAR] => 1968
)
[1] => SimpleXMLElement Object
(
[0] => The dock of the bay
)
[2] => SimpleXMLElement Object
(
[@attributes] => Array
(
[id] => 24
[genre] => soul
)
[TITLE] => The dock of the bay
[ARTIST] => Otis Redding
[COUNTRY] => USA
[COMPANY] => Stax Records
[PRICE] => 7.90
[YEAR] => 1968
) ...
依此类推,在每个子元素之后重复CD [23]元素。我尝试了很多这方面的变化,并且总是以某种方式获得重复。我不明白为什么会这样?
我尝试通过删除新的行和空格来编辑xml文档,因此元素之间没有文本节点,我得到的结果没有重复。这是xpath()方法表示那些文本节点的方式吗?
答案 0 :(得分:1)
我认为问题的一部分源于SimpleXML涉及的简化,xpath方法返回SimpleXMLElement
的数组,并使用node()
的路径选择{{1}的任何类型的子节点1}}在纯XPath映射中你会得到一个包含文本节点和元素节点的节点列表或集合,在选择文本节点的情况下,PHP的API设计者似乎返回其父元素,因此对于任何文本节点子节点如果选择了CD[23]
,则会获得在数组中返回的相同父元素。您可能希望使用CD[23]
选择任何子元素。