附加子元素时PHP DOMDocument缺少换行符

问题描述 投票:1回答:1

我试图恢复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>

但是,我想在根标记中添加一个新元素。

$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

php xml domdocument
1个回答
0
投票

解析器默认保留空白。它们被放入文本节点。实际上,root元素节点有五个子节点。换行和缩进的两个元素和三个文本节点。

现在,您要在最后一个空格文本节点之后添加第三个元素节点。串行器可识别混合类型的子节点,并且不会添加其他空格(它们可能会更改/破坏含义:<first-char>W</first-char>ord<first-char>W</first-char> ord)。

这里是属性DOMDocument::preserveWhiteSpace,您可以在加载XML之前将其设置为false。在这种情况下,解析器将不会创建任何空白文本节点,并且子节点也不会是混合类型。

$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();
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.