2017-05-25 72 views
2

我想找到一種方法來正確使用xpath來選擇某些元素,並且我的解決方案部分工作,而且我不知道如何修理它。如何使用PHP中包含某個子節點的XPath獲取所有XML節點

這裏是一個示例XML:

<Database> 
    <Items> 
     <Item> 
      <Name>A</Name> 
      <Locations> 
       <Location>A</Location> 
       <Location>B</Location> 
       <Location>C</Location> 
      </Locations> 
     </Item> 
     <Item> 
      <Name>B</Name> 
      <Locations> 
       <Location>E</Location> 
      </Locations> 
     </Item> 
     <Item> 
      <Name>C</Name> 
      <Locations> 
       <Location>D</Location> 
       <Location>E</Location> 
      </Locations> 
     </Item> 
    </Items> 
</Database> 

而且我使用這個PHP代碼,以獲得含有一個位置 「E」

$LocationFilter = "E" //hard written, it's actually a GET param 
$filter = $xml->xpath("//Items/Item[contains(Locations/Location,'".$LocationFilter."')]"); 

foreach ($filter as $Item) { 
    echo($filter->Name); 
} 

而不是讓BC和所有項目(名稱),我只得到B,換句話說,我只得到那些第一個位置是E的物品,而不是所有在任何位置包含E的物品。

我不確定爲什麼這不起作用,但我希望我已經解釋得很好。

回答

0

改變這種

$filter = $xml->xpath("//Items/Item[contains(Locations/Location,'".$LocationFilter."')]"); 

這個

$filter = $xml->xpath("//Items/Item[Locations/Location = '".$LocationFilter."'] "); 

固定的問題,現在項目顯示正常。

2

預計單身人士作爲第一個參數傳遞。如果收到多個節點,則只評估第一個節點。這解釋了爲什麼在您的測試中,XPath沒有返回Item,並且名稱爲C

在你必須使用的情況下,正確的方法是應用方法單獨Location元素:

//Items/Item[Locations/Location[contains(.,'E')]] 
相關問題