Можно ли вставить тег комментария в xml, используя simplexml? - PullRequest
7 голосов
/ 26 января 2010

Я использую SimpleXML для создания документа и задаюсь вопросом, можно ли вставить тег комментария в документ следующим образом:

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

EDIT

Комментарий находится где-то посередине документа.

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

Ответы [ 4 ]

6 голосов
/ 26 января 2010

К сожалению, 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>
5 голосов
/ 26 января 2010

Нет, но, очевидно, вы можете использовать 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 напрямую?

4 голосов
/ 12 июня 2014

На самом деле есть подвох, основанный на том факте, что addChild не проверяет правильность имени элемента:

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

При использовании $root->asXML() вы получите строку, подобную этой:

<root><!-- Your comment --><dummy/></root>

Вы можете заметить, что он также сгенерировал пустой элемент <dummy>, но это цена, которую нужно заплатить. Не пытайтесь добавить значение, это только испортит все. Используйте только в сочетании с asXML().

Ну, я сказал , что это подло. Я не рекомендую использовать это в рабочей среде , но только для целей отладки / тестирования.

2 голосов
/ 21 декабря 2018

Вот быстрое и простое решение:

$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>
...