首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将XML附加到DOMNode中

将XML附加到DOMNode中
EN

Stack Overflow用户
提问于 2015-06-30 17:16:06
回答 3查看 1.9K关注 0票数 0

我想将XML添加到DOMNode元素中,但是我得到了一个错误:“错误的文档错误”。

这是我的代码:

代码语言:javascript
运行
复制
$dom = new \DOMDocument();
$dom->loadXML($xmlResources->asXml());
$orderNodeList = $dom->getElementsByTagName('order');

foreach ($orderNodeList as $orderNode) {
    $idAddressDelivery = $orderNode->getElementsByTagName('id_address_delivery')->item(0)->nodeValue;
    $xmlToAppend = $this->getSpecificResource('addresses', $idAddressDelivery); //It returns a SimpleXMLElement

    $tmpNode = new \DOMDocument(); //I create a DOMDocument
    $tmpNode->loadXML($xmlToAppend->asXML()); //I fill it with XML

    $orderNode->appendChild($tmpNode); //I want to put the new XML inside the DOMNode, but it throws an error
}

我在网上搜索过,但不知道怎么做,你能告诉我出了什么问题吗?

谢谢你的帮助^^

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-06-30 17:42:21

节点位于单独的DOM中。但是,您只能追加属于同一DOM的节点。以下是两种可能性:

导入加载的节点。

代码语言:javascript
运行
复制
$target = new DOMDocument();
$target->loadXml("<one/>");

$source = new DOMDocument();
$source->loadXml("<two/>");

$target->documentElement->appendChild(
  $target->importNode($source->documentElement, TRUE)
);

echo $target->saveXml();

将XML加载到片段中并追加它。

代码语言:javascript
运行
复制
$target = new DOMDocument();
$target->loadXml("<one/>");

$fragment = $target->createDocumentFragment();
$fragment->appendXml("<two/>");

$target->documentElement->appendChild($fragment);

echo $target->saveXml();

输出:

代码语言:javascript
运行
复制
<?xml version="1.0"?>
<one><two/></one>

提示:您可能需要阅读有关DOMXpath::evaluate()的内容。它允许使用表达式获取节点。这比DOMNode::getElementsByTagName()这样的方法要强大得多。

票数 0
EN

Stack Overflow用户

发布于 2015-06-30 18:25:17

错误信息

错误文件错误

在PHP中使用DOMDocument操作意味着,一个节点不是您希望它操作的文档的一部分。一个简单的例子是,您有两个不同的XML或HTML文档。

就你的具体情况而言,这两份文件是:

  1. $dom = new \DOMDocument(); (示例中的第1行)
  2. $tmpNode = new \DOMDocument(); //I create a DOMDocument (示例中的第9行)

解决方案

使来自不同文档的节点协同工作的一种方法是首先将https://secure.php.net/manual/domdocument.importnode放入文档中,然后对它们进行操作(例如,追加它们)。

一个例子

给定两个文档,蓝色- docA和红色- docB

代码语言:javascript
运行
复制
$docA = new DomDocument();
$docA->loadXML('<blue/>');

$docB = new DomDocument();
$docB->loadXML('<red/>');

通过导入节点,可以将docB的文档元素红色追加到以前的docA的文档元素蓝色:

代码语言:javascript
运行
复制
$red = $docA->importNode($docB->documentElement, true);
$docA->documentElement->appendChild($red);

这将成功地将其附加到易于显示的第一个文档中:

代码语言:javascript
运行
复制
$docA->formatOutput = true;
$docA->save('php://output');

它将提供这个输出(演示):

代码语言:javascript
运行
复制
<?xml version="1.0"?>
<blue>
  <red/>
</blue>

这有望向您展示如何像您想要的那样组合尽可能多的文档。请注意,您不能相互导入完整的DOMDocuments,但是可以导入document -元素,它是文档的根元素节点。

进一步的堆栈溢出引用

类似的问题也曾被问过,这是一份有选择性的现场问答材料清单:

票数 1
EN

Stack Overflow用户

发布于 2015-06-30 17:33:29

不能将外部节点附加到文档中。一种方法是使用第二个文档的xml字符串在第一个文档中创建一个新片段:

代码语言:javascript
运行
复制
$fragment = $dom->createDocumentFragment();
$fragment->appendXML(/* put your xml content as a string here*/);

$orderNode->appendChild($fragment);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31144422

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档