<и> в проблеме значения узла при создании XML с использованием документа DOM - PullRequest
0 голосов
/ 27 марта 2020

Я создаю скрипт для разбора json в XML с использованием DOM Document. Я столкнулся с проблемой, когда я хочу поместить <и> в значение узла в части createElement. < и > преобразуются в &lt; и &gt;, и я хочу, чтобы оно оставалось таким, как оно есть.

Как мне сделать так, чтобы оно оставалось таким, как есть?

Вот мой текущий код:

    $dom->encoding = 'utf-8';
    $dom->xmlVersion = '1.0';
    $dom->formatOutput = true;

    $root = $dom->createElement('questions', "<![CDATA[what animal walk above the wave?]]>");

    ....

    $dom->save('file.xml');

мой XML результат:

<question>&lt;![CDATA[what animal walk above the wave?]]&gt;</question>

Я ожидаю:

<question><![CDATA[what animal walk above the wave?]]></question>

Ответы [ 2 ]

1 голос
/ 27 марта 2020

Модель дерева XML и сериализованное представление - это совершенно разные вещи. В древовидной модели вы создаете узлы со строковыми значениями; генерация разметки происходит, когда дерево сериализуется в лексический XML. Таким образом, вы не можете поместить лексический XML в DOM и ожидать, что он переживет сериализацию.

0 голосов
/ 27 марта 2020

Второй аргумент DOMDocument::createElement()SimpleXMLElement::addChild()), а также DOMElement::$nodeValue имеют такое же странное поведение. Они убегают < и >, но не &. Чтобы избежать проблем в DOM, вы можете использовать DOMDocument::createTextNode() и DOMNode::$textContent. Разделы CDATA - это тип узла, для них вам нужно будет использовать DOMDocument::createCDATASection().

$document = new DOMDocument();
$examples = $document->appendChild($document->createElement('examples'));
$examples
  ->appendChild($document->createElement('one'))
  // append an explcit text node - original DOM approach
  ->appendChild($document->createTextNode('foo > bar'));
$examples
  ->appendChild($document->createElement('two'))
  // write textContent - DOM Level 3 shortcut
  ->textContent = 'foo > bar';
$examples
  ->appendChild($document->createElement('three'))
  // add CDATA sectiom
  ->appendChild($document->createCDATASection('foo > bar'));

$document->formatOutput = TRUE;
echo $document->saveXML();

Вывод:

<?xml version="1.0"?>
<examples>
  <one>foo &gt; bar</one>
  <two>foo &gt; bar</two>
  <three><![CDATA[foo > bar]]></three>
</examples>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...