php - 添加一个 XML block 作为 SimpleXMLElement 对象的子对象

标签 php xml simplexml add simpledom

我有这个 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/

上一篇:PHP int to date 问题

下一篇:PHP计算

相关文章:

PHP DOMDocument 没有正确格式化输出

php - 如何读取此 xml,获取 "parser error : CData section not finished"

javascript - Wordpress 为不同的表格自定义加载更多按钮

php - 网页不保留换行符

xml - 验证 XSD 中的可选 XML 元素

xml - 如何更改此 WSDL 中的 namespace 前缀?

php - 使用 SimpleXML 编写 XML 文件时如何使用命名空间

php - 将一个 PHP echo 分成 3 列

php - MySQL/PHP 5 - 获取最后提取的行的 ID

java - 在 android 中执行拖放时显示 ClassCastException