是否可以使用simplexml将注释标记插入到xml中?

时间:2010-01-26 11:25:30

标签: php xml simplexml

我正在使用SimpleXML构建文档,并想知道是否可以像这样在文档中插入注释标记:

<root>
  <!-- some comment -->
  <value>
</root>

修改

评论位于文档中间的某处。

<root>
  <tag1 />
  <!-- some comment -->
  <value />
</root>

4 个答案:

答案 0 :(得分:6)

不幸的是,SimpleXML不处理评论。正如它所提到的,DOM确实处理了注释,但与SimpleXML相比,它对于简单的东西来说是一种麻烦。

我的建议:尝试SimpleDOM。它是SimpleXML的扩展,所以一切都是一样的,它有一堆有用的方法来处理DOM的东西。

例如,insertComment($content, $mode)可以append向或插入给定节点的评论beforeafter。例如:

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>