2012-05-09 37 views
0

濾波結果考慮以下的test.xmlPHP和XPath,基於greatgrandchildren

<root> 
    <parent> 
     <ID>1</ID> 
     <child1>Value1</child1> 
     <child2>value11</child2> 
     <child3> 
      <grandchild> 
        <greatgrandchild>value1111</greatgrandchild> 
      </grandchild> 
     </child3> 
    </parent> 
    <parent> 
     <ID>2</ID> 
     <child1>value2</child1> 
     <child3> 
      <grandchild> 
        <greatgrandchild>value2222</greatgrandchild> 
      </grandchild> 
     </child3> 
    </parent> 
    <parent> 
     <ID>3</ID> 
     <child1>value3</child1> 
     <child2>value33</child2> 
     <child3> 
      <grandchild> 
        <greatgrandchild>value3333</greatgrandchild> 
      </grandchild> 
     </child3> 
    </parent> 
    <parent> 
     <ID>4</ID> 
     <child1>value4</child1> 
     <child2>value44</child2> 
     <child3> 
      <grandchild> 
        <greatgrandchild>value4444</greatgrandchild> 
      </grandchild> 
     </child3> 
     </parent> 
</root> 

當我使用的xpath「/根/父」以下,我很容易得到ID,child1的值,和child2。

但是我沒有得到孫子孫子的價值。

我能做些什麼來獲得這些值。

$query = '/root/parent' 
$xQuery = $xml->xpath($query); 
foreach($xQuery as $results){ 
    echo $results->ID; 
    echo $results->child1; 
    echo $results->child2; 
    echo $results->greatgrandchild; 
} 

我想根據greatgrandchild的值過濾結果。我可以成功過濾ID和child1和child2的結果。我希望以偉大的孩子的價值爲基礎得到一位父母及其所有的子孫後代。

這可能使用xpath?

我編輯了問題的措辭,並使用正確的test.xml,因爲我第一次有錯誤。

+0

請接受答案。 –

回答

1

有您的代碼2個問題,

  • grandchild節點是模糊的和畸形。 grandchild2的結束標記是grandchild,這是錯誤的。

    This is wrong------------+ 
             | 
             v 
    <grandchild2>value3333</grandchild> 
    
  • $results->grandchild不存在,而使用$results->child3->grandchild。這裏XPath返回所有parent節點下root節點SimpleXMLElement

要找到所有的parent元素,其child1=value3grandchild1=value333使用此查詢。

/root/parent[child1 = "value3" and child3/grandchild = "value333"] 
+0

嘿謝謝。我製作了這個XML只是爲了讓我更容易理解我想要達到的目標。這不是我使用的xml文件。我編輯了xml格式的錯誤。我仍然無法獲得孫子的價值。 – Marc

+0

查看我答案的第二個重點。那就是你需要的。 –

+0

好的完美!還有一個問題。我如何測試greatgrandchild的值,並仍然能夠使用相同的循環。例如下面的xpath不起作用。 /根/父[greatgrandchild = value333]。我知道這是行不通的,我不得不在/ root/parent/child3/grandchild [greatgrandchild = value333]行上添加更多內容。但是,我也想測試孩子2的值。如果是SQL,則該語句將是從根中選擇父母,其中greatgrandchild = value333和child1 = value3。是否有可能像這樣合併兩個xpath過濾器? – Marc