PHP将DOMDocument节点移动到新父节点

时间:2015-01-23 11:10:22

标签: php xml domdocument

我有一个来自客户端的xml文件,它不是我想要的完全,所以我必须重写它。

这就是我所拥有的:

<artikel>
    <kop>
        <titel>Artikel 2.</titel>
    </kop>

    <lid>
        <lidnr>1</lidnr>
        <al>content</al>
    </lid>

    <lid>
        <lidnr>2</lidnr>
        <al>content</al>
    </lid>

</artikel>

这就是我需要的:

<artikel>
    <kop>
        <titel>Artikel 2.</titel>
    </kop>

    <leden>
        <lid>
            <lidnr>1</lidnr>
            <al>content</al>
        </lid>

        <lid>
            <lidnr>2</lidnr>
            <al>content</al>
        </lid>
    </leden>
</artikel>

我不太了解xml,所以我遇到了问题。我认为这需要做:

1)创建一个new_parent_node&#34; leden&#34; 2)per&#34; lid&#34 ;:添加&#34; lid&#34;到了&#34; leden&#34;节点并从&#34; artikel&#34;中删除节点 3)添加新节点&#34; leden&#34;之后&#34; kop&#34;节点

这是我到目前为止所做的:

$dom->load($publicatieurl_xml);

$artikels = $dom->getElementsByTagName('artikel');            

foreach ($artikels as $key => $artikel) {

    $lidNodes = $artikel->getElementsByTagName('lid');
    if ( $lidNodes->length !== 0 ) {
        $new_parent_node = $dom->createElement('leden');
        foreach ( $lidNodes as $key => $lid ) {
            $new_parent_node->appendChild( $lid );
        }
        echo ($new_parent_node->ownerDocument->saveXML($new_parent_node));
    }                
}

这不起作用:$ new_parent_node-&gt; appendChild($ lid); 因为它是一个对象。

所以我需要知道的是:

1)我如何添加已经存在的XML元素&#34; $ lid&#34;到我的&#34; leden&#34;节点 2)我如何删除&#34;盖子&#34;节点?又一个foreach循环?因为我无法在附加$ lid的那个中移除它,因为这会破坏foreach元素......

1 个答案:

答案 0 :(得分:1)

我会使用XSLT。首先创建样式表文档:

translate.xsl

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <artikel>
      <xsl:copy-of select="/artikel/kop" />
      <leden>
        <xsl:copy-of select="/artikel/lid" />
      </leden>
    </artikel>
  </xsl:template>
</xsl:stylesheet>

现在出现了PHP代码:

// Load input from customer. (Can be an http:// url if desired)
$input = new DOMDocument();
$input->load('input.xml');

// Load the stylesheet document
$xsl = new DOMDocument();
$xsl->load('translate.xsl');

$xsltproc = new XSLTProcessor();
$xsltproc->importStylesheet($xsl);

// transformToXML() returns the translated xml as a string
echo $xsltproc->transformToXML($input);

// ... or transformToDoc() can be used if you need to
// further process the translated xml.
$newdoc = $xsltproc->transformToDoc($input);

顺便说一句,如果您不想将xsl存储在单独的文件中,可以使用DOMDocument::loadXML()加载它:

$xsl = new DOMDocument();
$xsl->loadXML(<<<EOF
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
    <artikel>
      <xsl:copy-of select="/artikel/kop" />
      <leden>
        <xsl:copy-of select="/artikel/lid" />
      </leden>
    </artikel>
  </xsl:template>
</xsl:stylesheet>
EOF
);