我想将XML添加到DOMNode元素中,但是我得到了一个错误:“错误的文档错误”。
这是我的代码:
$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
}
我在网上搜索过,但不知道怎么做,你能告诉我出了什么问题吗?
谢谢你的帮助^^
发布于 2015-06-30 09:42:21
节点位于单独的DOM中。但是,您只能追加属于同一DOM的节点。以下是两种可能性:
导入加载的节点。
$target = new DOMDocument();
$target->loadXml("<one/>");
$source = new DOMDocument();
$source->loadXml("<two/>");
$target->documentElement->appendChild(
$target->importNode($source->documentElement, TRUE)
);
echo $target->saveXml();
将XML加载到片段中并追加它。
$target = new DOMDocument();
$target->loadXml("<one/>");
$fragment = $target->createDocumentFragment();
$fragment->appendXml("<two/>");
$target->documentElement->appendChild($fragment);
echo $target->saveXml();
输出:
<?xml version="1.0"?>
<one><two/></one>
提示:您可能需要阅读有关DOMXpath::evaluate()
的内容。它允许使用表达式获取节点。这比DOMNode::getElementsByTagName()
这样的方法要强大得多。
发布于 2015-06-30 10:25:17
错误信息
错误文件错误
在PHP中使用DOMDocument操作意味着,一个节点不是您希望它操作的文档的一部分。一个简单的例子是,您有两个不同的XML或HTML文档。
就你的具体情况而言,这两份文件是:
$dom = new \DOMDocument();
(示例中的第1行)$tmpNode = new \DOMDocument(); //I create a DOMDocument
(示例中的第9行)解决方案
使来自不同文档的节点协同工作的一种方法是首先将https://secure.php.net/manual/domdocument.importnode放入文档中,然后对它们进行操作(例如,追加它们)。
一个例子
给定两个文档,蓝色- docA和红色- docB
$docA = new DomDocument();
$docA->loadXML('<blue/>');
$docB = new DomDocument();
$docB->loadXML('<red/>');
通过导入节点,可以将docB的文档元素红色追加到以前的docA的文档元素蓝色:
$red = $docA->importNode($docB->documentElement, true);
$docA->documentElement->appendChild($red);
这将成功地将其附加到易于显示的第一个文档中:
$docA->formatOutput = true;
$docA->save('php://output');
它将提供这个输出(演示):
<?xml version="1.0"?>
<blue>
<red/>
</blue>
这有望向您展示如何像您想要的那样组合尽可能多的文档。请注意,您不能相互导入完整的DOMDocuments,但是可以导入document -元素,它是文档的根元素节点。
进一步的堆栈溢出引用
类似的问题也曾被问过,这是一份有选择性的现场问答材料清单:
发布于 2015-06-30 09:33:29
不能将外部节点附加到文档中。一种方法是使用第二个文档的xml字符串在第一个文档中创建一个新片段:
$fragment = $dom->createDocumentFragment();
$fragment->appendXML(/* put your xml content as a string here*/);
$orderNode->appendChild($fragment);
https://stackoverflow.com/questions/31144422
复制