能否使用simplexml向XML中插入注释标记?

12

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

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

编辑:

这个评论在文档的中间位置。

<root>
  <tag1 />
  <!-- some comment -->
  <value />
</root>
5个回答

9

很不幸,SimpleXML无法处理注释。正如提到的那样,DOM可以处理注释,但与SimpleXML相比,在处理简单内容时使用起来有些麻烦。

我的建议:尝试SimpleDOM。它是SimpleXML的扩展,所以一切都一样,并且它有许多有用的方法来处理DOM内容。

例如,insertComment($content, $mode)可以在给定节点之前或之后“附加”或插入注释。例如:

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>

谢谢,Josh。我也可能会觉得那很有用。以前没听说过那个库。 - halfer

6

不可以,但显然你可以使用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);

但是,为什么不直接使用DOM呢?


5

实际上有一个不太光彩的技巧,基于这样一个事实:addChild没有检查元素名称是否有效:

$root->addChild('!-- Your comment --><dummy');

当使用$root->asXML()时,您会得到这样一个字符串:
<root><!-- Your comment --><dummy/></root>

你可能会注意到它还生成了一个空的<dummy>元素,但这是需要付出的代价。不要尝试添加值,这只会搞乱一切。只在使用asXML()的情况下使用。

嗯,我确实说过这是个卑鄙的伎俩。但我不建议在生产环境中使用,仅限于调试/测试目的。

你的第一个命令中是否有错别字(在 ! 前面缺少 <)? - beroe
@beroe 不,就是这样。试一下。 - MaxArt
好的,明白了。现在我看到它被包装在< />中,这就提供了“缺失”的方括号。确实是个小技巧 :^) - beroe
1
为了我的目的,我最终选择了无聊的解决方案 $comment = $dom->createComment("My Comment"); $dom->appendChild($comment); - beroe

4
这里有一个快速简单的解决方案:
$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>

0
$CommentNode = $xml->createComment("some comment");
$root->appendChild($CommentNode);

5
您的回答可以通过提供更多支持性信息来改进。请[编辑]以添加更多详细信息,如引用或文档,使其他人可以确认您的答案是否正确。您可以在帮助中心中找到有关编写良好答案的更多信息。 - Community
我认为这是针对 DOMDocument 对象的。然而,这与明确要求关于 SimpleXML 对象的问题无关。 - lubosdz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接