【问题标题】:Adding a block of XML as child of a SimpleXMLElement object添加一个 XML 块作为 SimpleXMLElement 对象的子对象
【发布时间】:2023-03-25 22:05:01
【问题描述】:

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

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

$sx = new SimpleXMLElement( $xml );

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

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

... will generate
<book>
    <name>EFGH</name>
</book>

现在我正在尝试找出一种方法,我可以使用这个生成的 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>

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

【问题讨论】:

标签: php xml simplexml add simpledom


【解决方案1】:

两种解决方案。首先,在 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>'
);

【讨论】:

  • 我会选择第一种方法,因为它不涉及任何外部库。对代码进行了一些尝试,并设法找出了确切的代码序列。谢谢。这帮助了大时代:)
  • 如果您还有确切的代码序列,请提供...!
  • 嗨孩子们,我添加了一个代码示例,展示了它是如何工作的,包括一个在线演示。我不知道为什么在过去的三年半中没有提供此功能,因为此问答显示了一个基本且有用的概念。你们都可能有超级密码;) - 是的,现在 SimpleDOM 在我眼里完全是多余的。
【解决方案2】:

看看我的代码:

$doc = new DOMDocument();       
$doc->loadXML("<root/>");       

$fragment = $doc->createDocumentFragment();     
$fragment->appendXML("<foo>text</foo><bar>text2</bar>");
$doc->documentElement->appendChild($fragment);

echo $doc->saveXML();

这会通过添加 XML 片段来修改 XML 文档。 Online Demo

【讨论】:

  • 您的代码很好并且可以正常工作:eval.in/17709 - 暂时删除关于保存的部分,您只是有一个 XML 修改、不相关的保存到磁盘的问题,您应该将其放在另一个问题中.
  • @hakre saveXML 返回一个字符串,它实际上并没有将它保存到磁盘。
猜你喜欢
  • 1970-01-01
  • 2012-03-08
  • 1970-01-01
  • 2012-06-09
  • 1970-01-01
  • 1970-01-01
  • 2014-03-09
  • 2010-11-05
  • 2019-05-11
相关资源
最近更新 更多