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

pih*_*agy 8 php xml simplexml

我正在使用SimpleXML来构建文档,并想知道是否可以将注释标记插入到文档中,如下所示:

<root>
  <!-- some comment -->
  <value>
</root>
Run Code Online (Sandbox Code Playgroud)

编辑:

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

<root>
  <tag1 />
  <!-- some comment -->
  <value />
</root>
Run Code Online (Sandbox Code Playgroud)

Jos*_*vis 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();
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)


Gor*_*don 5

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


Max*_*Art 5

实际上有一个肮脏的技巧,基于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()

好吧,我确实说过这是一个肮脏的伎俩。我不建议在生产中使用它,而仅用于调试/测试目的。