2010-01-21 47 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