PHP DOMDocument пропускает структурную строку при добавлении дочернего элемента - PullRequest
1 голос
/ 07 мая 2020

Я пытался восстановить файл XML и добавить новый элемент, но, похоже, в конце пропущено '\ n'.

Например, исходный файл похож на

$doc = new DOMDocument;
$doc->formatOutput = true;
$node = $doc->createElement("root");
$ele = $doc->createElement("first-ele", 'ele1');
$node->appendChild($ele);
$ele2 = $doc->createElement("sec-ele", 'ele2');
$node->appendChild($ele2);
$doc->appendChild($node);
$data_string = $doc->saveXML();
echo $doc->saveXML();

Хороший результат.

<?xml version="1.0"?>
<root>
  <first-ele>ele1</first-ele>
  <sec-ele>ele2</sec-ele>
</root>

Однако я хочу добавить новый элемент в тег root.

$new_doc = new DOMDocument;
$new_doc->loadXML($data_string);
$new_doc->formatOutput = true;
$root = $new_doc->getElementsByTagName('root')->item(0);
$new_element = $new_doc->createElement('third-ele', 'third');
$root->appendChild($new_element);
echo $new_doc->saveXML();

Кажется, что результат пропустите линию разрыва.

<?xml version="1.0"?>
<root>
  <first-ele>ele1</first-ele>
  <sec-ele>ele2</sec-ele>
<third-ele>third</third-ele></root>

Демо ~ https://3v4l.org/PFk10

1 Ответ

1 голос
/ 07 мая 2020

По умолчанию парсер сохраняет пробелы. Они помещаются в текстовые узлы. Фактически, узел элемента root имеет пять дочерних узлов. Два элемента и три текстовых узла для разрывов строк и отступов.

Теперь вы добавляете третий узел элемента после последнего пробельного текстового узла. Сериализатор распознает дочерние узлы смешанного типа и не добавляет дополнительных пробелов (они могут изменить / нарушить значение: <first-char>W</first-char>ord vs <first-char>W</first-char> ord).

Вот свойство DOMDocument::preserveWhiteSpace, которое вы можете установить на false перед загрузкой XML. В этом случае синтаксический анализатор не будет создавать никаких текстовых узлов с пробелами, а дочерние узлы не будут смешанного типа.

$new_doc = new DOMDocument;
$new_doc->preserveWhiteSpace = false;
$new_doc->loadXML($data_string);
$new_doc->formatOutput = true;
$root = $new_doc->documentElement;
$new_element = $new_doc->createElement('third-ele', 'third');
$root->appendChild($new_element);
echo $new_doc->saveXML();
...