为什么node()XPath节点类型测试在与SimpleXMLElement一起使用时会返回重复项?

时间:2017-08-15 11:53:10

标签: php xml xpath simplexml

我用这个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()方法表示那些文本节点的方式吗?

1 个答案:

答案 0 :(得分:1)

我认为问题的一部分源于SimpleXML涉及的简化,xpath方法返回SimpleXMLElement的数组,并使用node()的路径选择{{1}的任何类型的子节点1}}在纯XPath映射中你会得到一个包含文本节点和元素节点的节点列表或集合,在选择文本节点的情况下,PHP的API设计者似乎返回其父元素,因此对于任何文本节点子节点如果选择了CD[23],则会获得在数组中返回的相同父元素。您可能希望使用CD[23]选择任何子元素。