我有一個看起來像這樣的XML文檔:如何克隆PHP中沒有數據的獨特XML結構?
<root>
<node/>
<node>
<sub>more</sub>
</node>
<node>
<sub>another</sub>
</node>
<node>value</node>
</root>
這裏是我的僞代碼:
import xml.
create empty-xml.
foreach child of imported-xml-root-node,
recursively clone node structure without data.
if clone does not match one already in empty-xml,
then add clone to empty-xml.
我想要得到的結果,看起來像這樣:
<root>
<node/>
<node>
<sub/>
</node>
</root>
注意我的piddly示例數據只有3個節點深。在生產中,會有未知數量的後代,因此可接受的答案需要處理變量節點深度。
失敗途徑
我已審查The DOMNode class具有cloneNode
法,我想用遞歸選項,但它會採取一些額外的工作來清除數據。但是,雖然該類包含一個hasChildNodes
函數,它返回一個布爾值,但是我找不到實際返回子集合的方法。
$doc = new DOMDocument();
$doc->loadXML($xml);
$root_node = $doc->documentElement;
if ($root_node->hasChildNodes()) {
// looking for something like this:
// foreach ($root_node->children() as $child)
// $doppel = $child->cloneNode(true);
}
其次,我已經試過我的手與The SimpleXMLElement class它確實有一個真棒children
方法。雖然它沒有遞歸選項,但我建立了一個簡單的函數來克服它。但是這個類缺少一個clone/copyNode方法,而且我的函數膨脹成了一些令人討厭的補償。現在我正在考慮結合使用這兩個類,所以我可以訪問SimpleXMLElement::children
和DOMDocument::cloneNode
,但我可以告訴這不是乾淨利落,當然這個問題可以更好地解決。
$sxe = new SimpleXMLElement($xml);
$indentation = 0;
function getNamesRecursive($xml, &$indentation)
{
$indentation++;
foreach($xml->children() as $child) {
for($i=0;$i<$indentation;$i++)
echo "\t";
echo $child->getName() . "\n";
getNamesRecursive($child,$indentation);
}
$indentation--;
}
getNamesRecursive($sxe,$indentation);
便攜式根節點的選擇:'$ doc-> documentElement' – rjdown
@rjdown哦真棒,謝謝!我編輯了我的問題來解決這個問題。很高興知道! –
[DOMNode :: $ childNodes](http://php.net/manual/de/class.domnode.php#domnode.props.childnodes)是屬性,而不是方法。 – ThW