我有一个数组$arr=array("A-B-C-D","A-B-E","A-B-C-F")
,我预期的XML输出应该是
<root>
<A>
<B>
<C>
<D></D>
<F></F>
</C>
<E></E>
</B>
</A>
</root>
我已经完成了为第一个数组元素(即A-B-C-D)创建XML的新节点的代码。但是当我移动到第二个元素时,我需要检查已经创建了多少个节点(A-B),然后根据它在正确位置添加新节点。
那么我如何遍历XML并找到新节点应该附加的确切位置?
我当前的代码看起来像这样
$arr=explode("-",$input);
$doc = new DomDocument();
$doc->formatOutput=true;
$doc->LoadXML('<root/>');
$root = $doc->documentElement;
$comm = $doc->createElement('comm');
$root->appendChild($comm);
foreach($arr as $a2) {
$newcomm = $doc->createElement($a2);
$community->appendChild($newcomm);
$community=$newcomm;
}
我应该使用xpath还是其他一些方法会更容易?
答案 0 :(得分:1)
为了坚持使用DOMDocument,我添加了一个额外的循环,允许你添加所有原始数组项。主要是在添加新项目之前,检查它是否已经存在...
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
$set=array("A-B-C-D","A-B-E","A-B-C-F-G", "A-B-G-Q");
$doc = new DomDocument();
$doc->formatOutput=true;
$doc->LoadXML('<root/>');
foreach ( $set as $input ) {
$arr=explode("-",$input);
$base = $doc->documentElement;
foreach($arr as $a2) {
$newcomm = null;
// Decide if the element already exists.
foreach ( $base->childNodes as $nextElement ) {
if ( $nextElement instanceof DOMElement
&& $nextElement->tagName == $a2 ) {
$newcomm = $nextElement;
}
}
if ( $newcomm == null ) {
$newcomm = $doc->createElement($a2);
$base->appendChild($newcomm);
}
$base=$newcomm;
}
}
echo $doc->saveXML();
由于没有快速方法(据我所知)检查具有特定标记名称的子项,因此它只查看具有相同名称的DOMElement的所有子元素。
我开始使用getElementByTagName
,但这会找到任何具有名称的子节点,而不仅仅是当前级别。
上面的输出是......
<?xml version="1.0"?>
<root>
<A>
<B>
<C>
<D/>
<F>
<G/>
</F>
</C>
<E/>
<G>
<Q/>
</G>
</B>
</A>
</root>
我添加了一些其他项目,以表明它可以在正确的位置添加内容。