我有一个来自客户端的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元素......
答案 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
);