2017-08-15 23 views
0

我用這個examle xml document來練習。我不明白XPath中的node()函數。例如,如果我寫:爲什麼node()XPath節點類型測試在與SimpleXMLElement一起使用時返回重複項?

$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

從https://stackoverflow.com/questions/11744465/xpath-difference-between-node-and-text開始 –

+1

我認爲部分問題是由SimpleXML涉及的簡化造成的,'xpath'方法返回一個數組'SimpleXMLElement'的數組,以及使用'node()'在純XPath映射中選擇CD [23]的任何種類的子節點的路徑,您將獲得包含文本節點和元素節點的節點列表或集合,似乎該PHP的API的設計者在選定文本節點的情況下返回其父元素,因此對於CD [23]的任何文本節點子節點,您都可以獲得該數組中返回的元素。你可能想用'CD [23]/*'去選擇任何子元素。 –

+0

謝謝,現在更清楚 – cappet

回答

1

我認爲問題的一部分,從SimpleXML的包括簡化的效果,XPath的方法返回的SimpleXMLElement S和使用node()在純的XPath映射選擇任何一種CD[23]子節點,你會得到你的路徑數組一個包含文本節點和元素節點的節點列表或集合,似乎該PHP API的設計者在選定文本節點的情況下返回其父元素,因此對於CD[23]的任何文本節點子節點選擇,您將獲得返回的相同父元素陣列。您可能想要使用CD[23]/*來選擇任何子元素。

相關問題