我有一个简单的XML字符串:
$sample = new SimpleXMLElement('<root><parent><child1></child1></parent></root>');
并尝试使用xpath()查找节点并将child添加到此节点。
$node = $sample->xpath('//parent');
$node[0]->addChild('child2');
echo $sample->asXML();
如您所见,child2
被添加为child1
的孩子,而不是parent
的孩子。
<root>
<parent>
<child1>
<child2></child2>
</child1>
</parent>
</root>
但是如果我改变我的XML,addChild()效果很好。这段代码
$sample = new SimpleXMLElement('<root><parent><child1><foobar></foobar></child1></parent></root>');
$node = $sample->xpath('//parent');
$node[0]->addChild('child2');
echo $sample->asXML();
返回
<root>
<parent>
<child1>
<foobar></foobar>
</child1>
<child2>
</child2>
</parent>
</root>
所以我有两个问题:
child2
没有孩子,我如何将parent
添加为child1
的孩子?答案 0 :(得分:0)
xpath()返回传递给它的元素的CHILDREN。因此,当addChild()返回到第一个元素xpath()时,实际上是将一个子元素添加到父元素的第一个元素,即child1。当你运行这段代码时,你会发现那是在创建一个“parentChild”元素作为“父”的孩子 -
<?php
$original = new SimpleXMLElement('<root><parent><child1></child1></parent></root>');
$root = new SimpleXMLElement('<root><parent><child1></child1></parent></root>');
$parent = new SimpleXMLElement('<root><parent><child1></child1></parent></root>');
$child1 = new SimpleXMLElement('<root><parent><child1></child1></parent></root>');
$tXml = $original->asXML();
printf("tXML=[%s]\n",$tXml);
$rootChild = $root->xpath('//root');
$rootChild[0]->addChild('rootChild');
$tXml = $root->asXML();
printf("node[0]=[%s] tXML=[%s]\n",$rootChild[0],$tXml);
$parentChild = $parent->xpath('//parent');
$parentChild[0]->addChild('parentChild');
$tXml = $parent->asXML();
printf("node[0]=[%s] tXML=[%s]\n",$parentChild[0],$tXml);
$child1Child = $child1->xpath('//child1');
$child1Child[0]->addChild('child1Child');
$tXml = $child1->asXML();
printf("node[0]=[%s] tXML=[%s]\n",$child1Child[0],$tXml);
?>
tXML=[<?xml version="1.0"?>
<root><parent><child1/></parent></root>]
tXML=[<?xml version="1.0"?>
<root><parent><child1/></parent><rootChild/></root>]
tXML=[<?xml version="1.0"?>
<root><parent><child1/><parentChild/></parent></root>]
tXML=[<?xml version="1.0"?>
<root><parent><child1><child1Child/></child1></parent></root>]