我想将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
}
我在网上搜索过,但不知道怎么做,请问你能说出什么问题?
感谢您的帮助^^
答案 0 :(得分:1)
错误消息
错误的文档错误
在PHP中使用 DOMDocument 进行操作意味着,该节点不是您希望它与之一起运行的文档的一部分。一个简单的例子是,您有两个不同的XML或HTML文档。
在您的具体情况下,这两个文件是:
$dom = new \DOMDocument();
(示例中的第1行)$tmpNode = new \DOMDocument(); //I create a DOMDocument
(您的示例中的第9行)使不同文档中的节点协同工作的一种方法是先将import nodes放入文档中,然后对它们进行操作(例如附加它们)。
鉴于两个文件, blue - docA 和 red - docB :
$docA = new DomDocument();
$docA->loadXML('<blue/>');
$docB = new DomDocument();
$docB->loadXML('<red/>');
docB 的文档元素 red 可以附加到前 docA 的文档元素 blue 中导入节点:
$red = $docA->importNode($docB->documentElement, true);
$docA->documentElement->appendChild($red);
这将成功地将其附加到第一个可以轻松显示的文档中:
$docA->formatOutput = true;
$docA->save('php://output');
这将给出此输出(Demo):
<?xml version="1.0"?>
<blue>
<red/>
</blue>
这有望向您展示如何根据需要将多个文档组合在一起。请注意,您无法将完整的 DOMDocument 导入到彼此,但您可以导入 document-element 这是根元素节点一份文件。
以前曾提出类似的问题,这是现场相关Q&amp; A资料的选择性清单:
答案 1 :(得分:0)
您无法将外部节点附加到文档中。一种方法是使用第二个文档的xml字符串在第一个文档中创建一个新片段:
$fragment = $dom->createDocumentFragment();
$fragment->appendXML(/* put your xml content as a string here*/);
$orderNode->appendChild($fragment);
答案 2 :(得分:0)
节点位于单独的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()
等方法强大得多。