我有这个 SimpleXMLElement 对象,其 XML 设置类似于以下...
$xml = <<<EOX
<books>
<book>
<name>ABCD</name>
</book>
</books>
EOX;
$sx = new SimpleXMLElement( $xml );
现在我有一个名为 Book 的类,其中包含信息。关于每一本书。同级还可以吐出book info。类似于上面的 XML 格式(嵌套 block ).. 例如,
$book = new Book( 'EFGH' );
$book->genXML();
... will generate
<book>
<name>EFGH</name>
</book>
现在我正在尝试找出一种方法,通过它我可以使用这个生成的 XML block 并将其作为子项追加,这样现在它看起来像......例如......
// Non-existent member method. For illustration purposes only.
$sx->addXMLChild( $book->genXML() );
...XML tree now looks like:
<books>
<book>
<name>ABCD</name>
</book>
<book>
<name>EFGH</name>
</book>
</books>
根据我阅读的有关 SimpleXMLElement 的文档,addChild() 不会为您完成此操作,因为它不支持将 XML 数据作为标记值。
最佳答案
两种解决方案。首先,在 libxml/DOMDocument/SimpleXML 的帮助下完成:您必须将 $sx
对象导入 DOM ,创建一个 DOMDocumentFragment
并使用 DOMDocumentFragment::appendXML()
:
$doc = dom_import_simplexml($sx)->ownerDocument;
$fragment = $doc->createDocumentFragment();
$fragment->appendXML($book->genXML());
$doc->documentElement->appendChild($fragment);
// your original $sx is now already modified.
参见 Online Demo .
您还可以从 SimpleXMLElement 扩展并添加提供此功能的方法。然后使用这个专门的对象将允许您轻松创建以下内容:
$sx = new MySimpleXMLElement($xml);
$sx->addXML($book->genXML());
另一种解决方案是使用已经内置此功能的 XML 库,例如 SimpleDOM。你抢SimpleDOM并且您使用 insertXML(),它的工作方式类似于您描述的 addXMLChild() 方法。
include 'SimpleDOM.php';
$books = simpledom_load_string(
'<books>
<book>
<name>ABCD</name>
</book>
</books>'
);
$books->insertXML(
'<book>
<name>EFGH</name>
</book>'
);
关于php - 添加一个 XML block 作为 SimpleXMLElement 对象的子对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1824568/