添加 XML 块作为 SimpleXMLElement 对象的子对象

miC*_*inG 5 php xml simplexml addition simpledom

我有这个 SimpleXMLElement 对象,其 XML 设置类似于以下内容...

$xml = <<<EOX
<books>
    <book>
        <name>ABCD</name>
    </book>
</books>
EOX;

$sx = new SimpleXMLElement( $xml );
Run Code Online (Sandbox Code Playgroud)

现在我有一个名为 Book 的类,其中包含信息。关于每本书。同班还可以吐出书籍信息。类似于上面的 XML 格式(嵌套块).. 例如,

$book = new Book( 'EFGH' );
$book->genXML();

... will generate
<book>
    <name>EFGH</name>
</book>
Run Code Online (Sandbox Code Playgroud)

现在我试图找出一种方法,通过它我可以使用这个生成的 XML 块并将其附加为 的子项,以便现在它看起来像......例如......

// 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>
Run Code Online (Sandbox Code Playgroud)

根据我在 SimpleXMLElement 上阅读的文档,addChild()不会为您完成此操作,因为它不支持 XML 数据作为标记值。

Jos*_*vis 4

两种解决方案。首先,您可以在 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.
Run Code Online (Sandbox Code Playgroud)

请参阅在线演示

您还可以从SimpleXMLElement扩展并添加提供此功能的方法。使用这个专门的对象可以让您轻松创建以下内容:

$sx = new MySimpleXMLElement($xml);

$sx->addXML($book->genXML());
Run Code Online (Sandbox Code Playgroud)

另一种解决方案是使用已经内置此功能的 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>'
);
Run Code Online (Sandbox Code Playgroud)