在PHP中将XML附加到DOMNode

时间:2015-06-30 17:16:06

标签: php xml

我想将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
}

我在网上搜索过,但不知道怎么做,请问你能说出什么问题?

感谢您的帮助^^

3 个答案:

答案 0 :(得分:1)

错误消息

  

错误的文档错误

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

在您的具体情况下,这两个文件是:

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

    使不同文档中的节点协同工作的一种方法是先将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 这是根元素节点一份文件。

    进一步的Stackoverflow参考

    以前曾提出类似的问题,这是现场相关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()等方法强大得多。