0

我有一个简单的 XML 字符串:

$sample = new SimpleXMLElement('<root><parent><child1></child1></parent></root>');

我尝试使用 xpath() 查找节点并将子节点添加到该节点。

$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>

所以我有两个问题:

  1. 为什么?
  2. 如果没有孩子,我如何添加child2为的孩子?parentchild1
4

1 回答 1

0

xpath() 返回传递给它的元素的 CHILDREN。所以,当你 addChild() 到 xpath() 返回的第一个元素时,你实际上是在向 parent 的第一个元素添加一个子元素,即 child1。当您运行此代码时,您会看到它正在创建一个“parentChild”元素作为“parent”的子元素 -

<?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>]
于 2013-04-05T13:46:14.997 回答