根据php中父节点的属性将子句附加到xml

时间:2016-10-19 19:24:22

标签: php xml

我想问一下,如何轻松地将新节点附加到php中找到的节点的末尾。 可以说我有这样的xml:

<Root>
    <child id=1>
        <text>smth</text>
    </child>
</Root>

我想找到id为1的子元素,然后将另一个节点作为last添加。 我试图找到答案,但要么回答如何找到答案,要么如何写入答案,遗憾的是我无法将其整合在一起。

如果有人可以帮助我,我会很高兴。

2 个答案:

答案 0 :(得分:1)

您可以使用xpath查找相关节点(基于id),然后使用addChild将新的子节点添加到您刚找到的节点:< / p>

$str =<<< END
<Root>
    <child id="1">
        <text>smth</text>
    </child>
</Root>
END;

$result = simplexml_load_string($str);

$child = $result->xpath("*[@id='1']")[0];
$child->addChild('text', 'node value');

// The part from here is only to make the output pretty-xml
// instead you can just use $result->saveXML()
$dom = new DOMDocument("1.0");
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
$dom->loadXML($result->saveXML());
var_dump($dom->saveXML());

输出将是:

string(115) "<?xml version="1.0"?>
<Root>
    <child id="1">
        <text>smth</text>
        <text>node value</text>
    </child>
</Root>
"

答案 1 :(得分:0)

在DOM中,您使用Xpath查找节点DOMDocument::create*()以创建节点和方法(如DOMNode::appendChild())以将它们放入文档中。

$xml =<<< END
<Root>
    <child id="1">
        <text>smth</text>
    </child>
</Root>
END;

$document = new DOMDocument("1.0");
$document->preserveWhiteSpace = false;
$document->formatOutput = true;
$document->loadXml($xml);
$xpath = new DOMXpath($document);

foreach ($xpath->evaluate('//*[@id="1"][1]') as $parentNode) {
  $parentNode
    ->appendChild($document->createElement('text'))
    ->appendChild($document->createTextNode('node value'));
}

echo $document->saveXML();

输出:

<?xml version="1.0"?>
<Root>
  <child id="1">
    <text>smth</text>
    <text>node value</text>
  </child>
</Root>

对于大型XML文件,您可以使用XMLReader / XMLWriter,但不能修改文档。您必须逐步阅读原始内容并编写修改后的副本。