使用DOMDocuments将xml树附加到PHP中的另一个xml树

时间:2015-11-12 20:38:38

标签: php xml domdocument

我希望将xml树附加到另一个。

例如,我想要以下xml:

<a>
  <b>
    <c/>
  </b>
</a>

要在其中包含以下xml:

<n:d xmlns:xsl="namespace">
  <n:e>
    <n:f/>
  </n:e>
</n:d>

所以它看起来像这样:

<a>
  <b>
    <c/>
    <n:d xmlns:n="namespace">
      <n:e>
        <n:f/>
      </n:e>
    </n:d>
  </b>
</a>

我尝试过但未能执行此操作的代码如下:

$doc1 = new DOMDocument();
$doc2 = new DOMDocument();

$doc1->loadXML($xml1);
$doc2->loadXML($xml2);

$node_To_Insert = $doc2->getElementsByTagName('d')->item(0);
$node_To_Be_Inserted_To = $doc1->getElementsByTagName('b')->item(0);

$node_To_Be_Inserted_To->appendChild($doc1->importNode($node_To_Insert));

echo '<pre>'.htmlspecialchars(print_r($doc1->saveXML(),true)).'</pre>';

我从echo得到的当前结果:

<a>
  <b>
    <c/>
    <n:d xmlns:n="namespace" />
  </b>
</a>

我的想法是不可能无法阅读的,或者看似愚蠢的迂回。

任何帮助将不胜感激。提前谢谢。

2 个答案:

答案 0 :(得分:2)

您的解决方案非常接近。您只需执行deep copy with importNode即可获得所需的结果。

$node_To_Be_Inserted_To->appendChild($doc1->importNode($node_To_Insert, true));

答案 1 :(得分:1)

或者,处理XML转换的本地方式(例如suggested standalone)正在使用XSLT,这是专门为此需要重新构造,重新设计,重新格式化XML文档以用于各种目的的专用语言。 - 使用需求。

就像数据库中的另一种特殊用途语言SQL一样,XSLT非常适合XML文件。 PHP配备了一个XSLT处理器(可能需要启用扩展名:php_xsl.so)。

XSLT (另存为.xsl或.xslt文件)

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output version="1.0" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*" />

  <!-- Identity Transform -->
  <xsl:template match="@*|node()">
     <xsl:copy>
       <xsl:apply-templates select="@*|node()"/>
     </xsl:copy>
  </xsl:template>

  <xsl:template match="b">
    <b>
      <xsl:copy-of select="c" />
      <xsl:copy-of select="document('doc2.xml')"/>
    </b>
  </xsl:template> 
</xsl:transform>

PHP (仅加载第一个文档,因为上面的XSLT在特定节点加载第二个文档)

$doc1 = new DOMDocument();    
$doc1->load('doc1.xml');

$xsl = new DOMDocument;
$xsl->load('XSLTScript.xsl');

// Configure the transformer
$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl); 

// Transform XML source
$newXml = $proc->transformToXML($doc1);

// Save output to file
$xmlfile = 'Output.xml';
file_put_contents($xmlfile, $newXml);

<强>输出

<?xml version="1.0" encoding="UTF-8"?>
<a>
  <b>
    <c/>
    <n:d xmlns:n="namespace">
      <n:e>
        <n:f/>
      </n:e>
    </n:d>
  </b>
</a>