我正在使用SimpleXML来构建文档,并想知道是否可以将注释标记插入到文档中,如下所示:
<root>
<!-- some comment -->
<value>
</root>
Run Code Online (Sandbox Code Playgroud)
编辑:
评论位于文档中间的某处.
<root>
<tag1 />
<!-- some comment -->
<value />
</root>
Run Code Online (Sandbox Code Playgroud)
不幸的是,SimpleXML不处理注释.正如它所提到的,DOM确实处理了注释,但与SimpleXML相比,它对于简单的东西来说是一种麻烦.
我的建议:尝试SimpleDOM.它是SimpleXML的扩展,所以一切都是一样的,它有一堆有用的方法来处理DOM的东西.
例如,insertComment($content, $mode)可以append插入或插入注释before或after给定节点.例如:
include 'SimpleDOM.php';
$root = simpledom_load_string('<root><value/></root>');
$root->value->insertComment(' mode: append ', 'append');
$root->value->insertComment(' mode: before ', 'before');
$root->value->insertComment(' mode: after ', 'after');
echo $root->asPrettyXML();
Run Code Online (Sandbox Code Playgroud)
......会回应
<?xml version="1.0"?>
<root>
<!-- mode: before -->
<value>
<!-- mode: append -->
</value>
<!-- mode: after -->
</root>
Run Code Online (Sandbox Code Playgroud)
不,但显然你可以使用DomDocument作为解决方法(德语):
$oNodeOld = dom_import_simplexml($oParent);
$oDom = new DOMDocument();
$oDataNode = $oDom->appendChild($oDom->createElement($sName));
$oDataNode->appendChild($oDom->createComment($sValue));
$oNodeTarget = $oNodeOld->ownerDocument->importNode($oDataNode, true);
$oNodeOld->appendChild($oNodeTarget);
return simplexml_import_dom($oNodeTarget);
Run Code Online (Sandbox Code Playgroud)
但话说回来,为什么不直接使用DOM呢?
实际上有一个肮脏的技巧,基于addChild不检查元素名称是否有效的事实:
$root->addChild('!-- Your comment --><dummy');
Run Code Online (Sandbox Code Playgroud)
使用时$root->asXML()你会得到这样的字符串:
<root><!-- Your comment --><dummy/></root>
Run Code Online (Sandbox Code Playgroud)
您可能会注意到它<dummy>也生成了一个空元素,但这是要付出的代价。不要试图增加价值,这只会让一切变得混乱。仅与 一起使用asXML()。
好吧,我确实说过这是一个肮脏的伎俩。我不建议在生产中使用它,而仅用于调试/测试目的。