【问题标题】:Adding children recursively with PHP's DOM API使用 PHP 的 DOM API 递归添加子元素
【发布时间】:2009-07-29 21:14:29
【问题描述】:

我正在将一些代码从 SimpleXML 移动到 PHP 的 DOM,但还没有完全得到对象。

例如,在 SimpleXML 中,我可以很容易地创建嵌套元素,如下所示:

$Settings = new SimpleXMLElement("<root></root>");
$Settings->addChild('el1');
$Settings->el1->addChild('el2');
$Settings->el1->el2->addChild('el3');
$Settings->el1->el2->el3->addChild('el4', 'text');

echo("<pre>".htmlspecialchars(str_replace("><", ">\n<",$Settings->asXML()))."</pre>");

// Result
<?xml version="1.0"?>
<root>
<el1>
<el2>
<el3>
<el4>text</el4>
</el3>
</el2>
</el1>
</root>

虽然在 DOM 中,我似乎需要跟踪句柄,或者获取一个列表并循环遍历它,以便获取特定元素的 DOMElement。一定有一个更简单的方法,我错过了......

假设我有以下代码,并想像上面一样添加el1el2el3 等。最不冗长的方法是什么?最好不必为每个要添加子节点的节点使用变量作为句柄,也不必通过循环获取它们。

$DOMXML = new DOMDocument();
$DOMXML->appendChild($DOMXML->createElement('root'));
$DOMXML->documentElement->appendChild($DOMXML->createElement('el1));
// ...


echo($DOMXML->saveXML(););

【问题讨论】:

  • 使用importNode并将第二个参数(deep)设置为true,所以它会递归复制树。

标签: php xml dom


【解决方案1】:

我认为没有办法使用 DOM 来做你想做的事情 :-(
前段时间我尝试过,当时我不得不使用 DOM 生成一些 XML 文件...

我唯一能想到的就是你可能指的东西;一长串代码;像这样,我想:

$DOMXML = new DOMDocument();

$root = $DOMXML->createElement('root');
$DOMXML->appendChild($root);

$elt1 = $DOMXML->createElement('el1');
$root->appendChild($elt1);

$elt2 = $DOMXML->createElement('el2');
$elt1->appendChild($elt2);

$elt3 = $DOMXML->createElement('el3');
$elt2->appendChild($elt3);

$elt4 = $DOMXML->createElement('el4');
$elt4->appendChild($DOMXML->createTextNode('text'));
$elt3->appendChild($elt4);

echo("<pre>".htmlspecialchars(str_replace("><", ">\n<",$DOMXML->saveXML()))."</pre>");

确实很长:-(
好吧,它很强大,你可以用它做很多事情......但是,写起来还是很痛苦^^


另一种解决方案是同时使用 SimpleXML 和 DOM 的组合功能:

首先,使用 SimpleXML 创建(简单)您的 XML 文档,就像您之前所说的:

$simple2 = new SimpleXMLElement("<root></root>");
$simple2->addChild('el1');
$simple2->el1->addChild('el2');
$simple2->el1->el2->addChild('el3');
$simple2->el1->el2->el3->addChild('el4', 'text');

然后,使用 dom_import_simplexml 将其转换为 DOMDocument:

// Convert to DOMDocument
$dom2 = new DOMDocument();
$dom2->appendChild(
    $dom2->importNode(
        dom_import_simplexml($simple2), 
        true
    )
);

// Now, you can do your stuff that requires a DOMDocument object ;-)
// Well, right now, displaying it will be enough, I suppose ?

echo("<pre>".htmlspecialchars(str_replace("><", ">\n<",$dom2->saveXML()))."</pre>");

你会得到完全相同的输出:

<?xml version="1.0"?>
<root>
<el1>
<el2>
<el3>
<el4>text</el4>
</el3>
</el2>
</el1>
</root>

这可能不是最简单的解决方案,也不是最有效的解决方案......但它似乎正在工作,并且正在完成这项工作;-)

如果有人有其他想法...我也有兴趣,下次我将不得不与DOMDocument打交道!

【讨论】:

  • 谢谢!也许我可以将所有句柄保存在某种数组中,以避免有几十个变量。希望我可以只使用 simplexml(我最初是),但我正在使用一个讨厌它的对象。我不知道为什么,但是这个图表拒绝与任何与 SimpleXML 有任何关系的东西一起工作。 amcharts.com/forum/viewtopic.php?pid=9418#p9418
猜你喜欢
  • 1970-01-01
  • 2023-04-01
  • 2020-09-05
  • 2014-08-07
  • 2016-07-18
  • 2015-09-23
  • 2011-01-27
  • 2016-06-09
  • 2020-11-10
相关资源
最近更新 更多