我试图恢复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>
解析器默认保留空白。它们被放入文本节点。实际上,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();