【问题标题】:Append XML to DOMNode in PHP在 PHP 中将 XML 附加到 DOMNode
【发布时间】:2015-09-17 14:42:40
【问题描述】:

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

我在网上搜索过,但不知道如何制作,请您告诉我是什么问题?

感谢您的帮助^^

【问题讨论】:

    标签: php xml


    【解决方案1】:

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

    $fragment = $dom->createDocumentFragment();
    $fragment->appendXML(/* put your xml content as a string here*/);
    
    $orderNode->appendChild($fragment);
    

    【讨论】:

      【解决方案2】:

      节点位于单独的 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() 之类的方法强大得多。

      【讨论】:

      • 我刚试过你的解决方案,效果很好,谢谢你的回复!
      【解决方案3】:

      错误信息

      错误的文档错误

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

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

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

      解决方案

      让不同文档中的节点协同工作的一种方法是先将import nodes 放入文档中,然后对其进行操作(例如附加它们)。

      一个例子

      给定两个文档,蓝色 - docA红色 - 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 参考资料

      之前也有人问过类似的问题,这是现场相关问答材料的选择性列表:

      【讨论】:

        猜你喜欢
        • 2015-05-03
        • 2010-11-02
        • 1970-01-01
        • 1970-01-01
        • 2021-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-29
        相关资源
        最近更新 更多