CDATA-секции - это особый вид текстовых узлов.Они кодируют / декодируют намного меньше, и они сохраняют начальные / конечные пробелы.Таким образом, анализатор DOM должен читать те же значения из следующих двух примеров узлов:
<examples>
<example>text<example>
<example><![CDATA[text]]]></example>
</examples>
Чтобы создать раздел CDATA, используйте метод DOMDocument::createCDATASection()
и добавьте его как любой другой узел.DOMNode::appendChild()
возвращает добавленный узел, поэтому вы можете вкладывать вызовы:
$properties = [
[ 'name' => 'qid', 'value' => "1"]
];
$document = new DOMDocument();
$subquestions = $document->appendChild(
$document->createElement('subquestions')
);
// appendChild() returns the node, so it can be nested
$row = $subquestions->appendChild(
$document->createElement('row')
);
// append the properties as element tiwth CDATA sections
foreach ($properties as $property) {
$element = $row->appendChild(
$document->createElement($property['name'])
);
$element->appendChild(
$document->createCDATASection($property['value'])
);
}
$document->formatOutput = TRUE;
echo $document->saveXML();
Вывод:
<?xml version="1.0"?>
<subquestions>
<row>
<qid><![CDATA[1]]></qid>
</row>
</subquestions>
Использование обычных текстовых узлов работает лучше всего большую часть времени.
foreach ($properties as $property) {
$element = $row->appendChild(
$document->createElement($property['name'])
);
$element->appendChild(
$document->createTextNode($property['value'])
);
}
Это можно оптимизировать с помощью свойства DOMNode::$textContent
.
foreach ($properties as $property) {
$row->appendChild(
$document->createElement($property['name'])
)->textContent = $property['value'];
}