我正在使用SimpleXML构建文档,并想知道是否可以像这样在文档中插入注释标记:
<root>
<!-- some comment -->
<value>
</root>
修改:
评论位于文档中间的某处。
<root>
<tag1 />
<!-- some comment -->
<value />
</root>
答案 0 :(得分:6)
不幸的是,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();
...将回应
<?xml version="1.0"?>
<root>
<!-- mode: before -->
<value>
<!-- mode: append -->
</value>
<!-- mode: after -->
</root>
答案 1 :(得分:5)
不,但显然你可以use DomDocument as a workaround (german):
$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);
但话又说回来,为什么不直接使用DOM?
答案 2 :(得分:4)
实际上有一个肮脏的技巧,基于addChild
不检查元素名称是否有效的事实:
$root->addChild('!-- Your comment --><dummy');
使用$root->asXML()
时,你会得到一个这样的字符串:
<root><!-- Your comment --><dummy/></root>
您可能会注意到它也生成了一个空的<dummy>
元素,但这是付出的代价。不要试图添加一个值,它只会搞砸一切。仅将 与asXML()
结合使用。
好吧,我做了说这是一个肮脏的把戏。 我不建议在生产中使用它,但仅用于调试/测试目的。
答案 3 :(得分:2)
这是一个快速简便的解决方案:
$xml = new SimpleXMLElement('<root/>');
$xml->element->comment->sample = 12;
$xml_str = $xml->asXML();
$xml_str = str_replace(['<comment>', '</comment>'], ['<!--', '-->'], $xml_str)
echo $xml_str;
<root> <!-- <sample>12</sample> --> </root>