PHP - SimpleXML - AddChild with another SimpleXMLElement

2022-08-30 13:02:33

我正在尝试构建一个相当复杂的 XML 文档。

我有一堆重复的XML文档部分。我以为我会使用多个字符串模板作为各部分的基本文档,并使用simplexml_load_string创建XML元素的实例。

所以我有一个SimpleXMLElement的实例作为基础文档。

$root = simplexml_load_string($template_root);

然后我循环浏览数据库中的一些项目,创建新的SimpleXMLElement,如下所示:

for (bla bla bla):

$item = simplexml_load_string($template_item);使用 item // 尝试将 item 添加到根文档。
卡在这里..无法执行 $root->项->add子($item)

endfor;

我不能调用addChild,因为它只需要一个标签名称和值。你不能添加另一个SimpleXMLElementChild。

我在这里错过了什么吗?似乎真的很愚蠢,addChild不能将SimpleXMLELement作为参数。

有没有其他方法可以做到这一点?(除了使用不同的 xml 库)


答案 1

据我所知,你不能用SimpleXML来做到这一点,因为它不会对元素进行深度复制(通过调用可以很容易地克服指定标签名称所必需的)。addChildSimpleXMLElement::getName()

一种解决方案是改用 DOM:

使用此功能:

function sxml_append(SimpleXMLElement $to, SimpleXMLElement $from) {
    $toDom = dom_import_simplexml($to);
    $fromDom = dom_import_simplexml($from);
    $toDom->appendChild($toDom->ownerDocument->importNode($fromDom, true));
}

我们有

<?php
header("Content-type: text/plain");
$sxml = simplexml_load_string("<root></root>");

$n1 = simplexml_load_string("<child>one</child>");
$n2 = simplexml_load_string("<child><k>two</k></child>");

sxml_append($sxml, $n1);
sxml_append($sxml, $n2);

echo $sxml->asXML();

输出

<?xml version="1.0"?>
<root><child>one</child><child><k>two</k></child></root>

另请参阅一些使用递归函数和的用户注释,例如这个addChild


答案 2

您可以使用此函数,该函数基于创建具有来自源的属性的子级:

function xml_adopt($root, $new) {
    $node = $root->addChild($new->getName(), (string) $new);
    foreach($new->attributes() as $attr => $value) {
        $node->addAttribute($attr, $value);
    }
    foreach($new->children() as $ch) {
        xml_adopt($node, $ch);
    }
}

$xml = new SimpleXMLElement("<root/>");
$child = new SimpleXMLElement("<content><p a=\"aaaaaaa\">a paragraph</p><p>another <br/>p</p></content>");

xml_adopt($xml, $child);
echo $xml->asXML()."\n";

这将产生:

<?xml version="1.0"?>
<root><content><p a="aaaaaaa">a paragraph</p><p>another p<br/></p></content></root>

推荐