2012-02-12 52 views
2

如何通過知道屬性值而無需遍歷每個子節點和每個屬性/值來查找節點值?通過在屬性中選擇xml節點php

$dom = new DOMDocument; 
$dom->load('test.xml'); 

$rows = $dom->getElementsByTagName('row'); 

foreach ($rows as $row) { 

$header = VALUE OF <field name="header"> 
$text = VALUE OF <field name="text"> 

} 

XML:

<resultset> 
    <row> 
    <field name="item">2424</field> 
    <field name="header">blah blah 1</field> 
    <field name="text" xsi:nil="true" /> 
    ... 
    </row> 

    <row> 
    <field name="item">5321</field> 
    <field name="header">blah blah 2</field> 
    <field name="text">some text</field> 
    ... 
    </row> 
</resultset> 
+0

你不能......即使你使用了一個庫,在後端,它將不得不遍歷樹來找到你要找的東西。 – 2012-02-12 21:52:13

回答

4

最簡單的事情是用DOMXPath::querydocs

下面的代碼發現,有一個名字屬性等於「頭」 <row>節點內的所有<field>節點:

$dom = new DOMDocument; 
$dom->loadXML($str); // where $str is a string containing your sample xml 
$xpath = new DOMXPath($dom); 
$query = "//row/field[@name='header']"; 

$elements = $xpath->query($query); 

foreach ($elements as $field) { 
    echo $field->nodeValue, PHP_EOL; 
} 

使用樣本e xml你提供,上面的輸出:

blah blah 1 
blah blah 2 
+0

我曾經想過xpath,但它只會讓我選擇一個字段?我需要爲每個「行」填充幾個變量 – user1070125 2012-02-12 21:53:23

+0

我不確定這是否是你問的,但你可以堆疊屬性條件如下:'$ query =「// row/field [@ name = 'header'] [@ other_attr ='anything']「;'如果你問是否可以用一個xpath獲取多種類型的元素,那麼不會。您可以執行多個xpath查詢或循環遍歷所有這些查詢。對不起,如果這是你首先要問的。 *「通過知道屬性值」*來查找節點值「 - 這就是你的問題所說的 - 雖然是xpath情況。 – rdlowrey 2012-02-12 21:57:17