2010-01-21 45 views
2

我有以下結構的XML文檔:PHP:查找XML節點,並插入孩子

<?xml version="1.0" encoding="UTF-8"?> 
<items> 
    <item> 
    <id>1</id> 
    <url>www.test.com</url> 
    </item> 
    <item> 
    <id>2</id> 
    <url>www.test2.com</url> 
    </item> 
</items> 

我希望能夠尋找一個節點的值,如1的ID值領域。然後,找到該節點後,選擇父節點,該節點爲< item>並在其中插入新的子節點。

我知道使用dom文件的概念,但不知道在這種情況下如何做到這一點。

回答

4

這應該是一個開始:

$dom = new DOMDocument; 
$dom->loadXML($input); 
$ids = $dom->getElementsByTagName('id'); 
foreach ($ids as $id) { 
    if ($id->nodeValue == '1') { 
    $child = $dom->createElement('tagname'); 
    $child->appendChild($dom->createTextNode('some text')); 
    $id->parentNode->appendChild($child); 
    } 
} 
$xml = $dom->saveXML(); 

或接近它。

+0

這看起來非常有前途!讓我試試這個。 – 2010-01-21 06:58:44

+0

$ id-> nodeValue似乎不會返回任何內容。 – 2010-01-21 17:35:17

+0

@Nic:我已經嘗試了以上,它的工作原理。 – cletus 2010-01-21 22:29:59

2

你可以用更簡單的方法做同樣的事情。除了尋找一個節點,其值爲1然後選擇它的父節點,您可以反轉該關係並查找任何有孩子的節點,其值爲1

你可以做到這一點很容易在XPath中,這裏是如何做到這一點SimpleXML中:

$items = simplexml_load_string(
    '<?xml version="1.0" encoding="UTF-8"?> 
    <items> 
     <item> 
     <id>1</id> 
     <url>www.test.com</url> 
     </item> 
     <item> 
     <id>2</id> 
     <url>www.test2.com</url> 
     </item> 
    </items>' 
); 

$nodes = $items->xpath('*[id = "1"]'); 
$nodes[0]->addChild('new', 'value'); 

echo $items->asXML(); 
+0

試過這個並且我得到一個警告:致命錯誤:調用一個非對象的成員函數addChild() – 2010-01-22 21:09:13

+0

然後,您沒有''孩子的值爲'1'。我發佈的示例原樣使用。如果你正在尋找的節點不是孩子,而是文檔中的任何節點,那麼XPath應該是'// * [id =「1」]' – 2010-01-22 21:18:39

+0

啊,明白了,謝謝。 – 2010-01-22 22:15:19