我的名字是Rithy.
我不知道如何在xml中添加新节点或元素之前添加新行.
我的PHP:
$dom = new DOMDocument();
$dom->formatOutput = true;
$dom->preserveWhiteSpace = true;
$dom->load($xml_file);
$body = $dom->getElementsByTagName('body')->item(0);
$newelement_seg = $dom->createElement('seg');
$data = $dom->createTextNode(" text 2 ");
$newelement_seg->appendChild($data);
$body->appendChild($newelement_seg);
$dom->save($xml_file);
Run Code Online (Sandbox Code Playgroud)
XML在添加新子项之前:
<?xml version="1.0" encoding="UTF-8"?>
<body>
<seg>
text 1
</seg>
</body>
</xml>
Run Code Online (Sandbox Code Playgroud)
附加新子后的XML:
<?xml version="1.0" encoding="UTF-8"?>
<body>
<seg>
text 1
</seg>
<seg>
text 2
</seg>
</body>
</xml>
Run Code Online (Sandbox Code Playgroud)
但我想要:
<?xml version="1.0" encoding="UTF-8"?>
<body>
<seg>
text 1
</seg>
<seg>
text 2
</seg>
</body>
</xml>
<hr/>
Run Code Online (Sandbox Code Playgroud)
提前致谢!
总结提出的答案:
你必须将formatOutput设置为true
你必须将ignoreWhiteSpace设置为false
即:
$dom = new DomDocument();
$dom->formatOutput = true;
$dom->preserveWhiteSpace = false;
$dom->load($myxmlfile);
Run Code Online (Sandbox Code Playgroud)
你想达到什么目的?
通过设置preserveWhiteSpace
为true
(不必要;这是默认值),您可以告诉 libxml 不要忽略仅由空格组成的文本节点。然而,与此同时,您正在尝试漂亮地格式化 XML 文件,而要真正漂亮地格式化需要空白节点。
然后,即使忽略空白,您也必须意识到<seg>
标签内的空白很重要;libxml 不会删除那些;如果在 后强制换行text 1
,则下一行中的</seg>
结束标记不得缩进,否则标记内的文本节点的内容会有所不同。
你的代码给了我这个:
<?xml version="1.0" encoding="UTF-8"?>
<body>
<seg>
text 1
</seg>
<seg> text 2 </seg></body>
Run Code Online (Sandbox Code Playgroud)
由于您告诉 libxml 空格很重要,因此它不能在第二个之后换行</seg>
,否则它将创建另一个文本节点。
如果你说$dom->preserveWhiteSpace = false;
:
<?xml version="1.0" encoding="UTF-8"?>
<body>
<seg>
text 1
</seg>
<seg> text 2 </seg>
</body>
Run Code Online (Sandbox Code Playgroud)
标签已缩进,但 libxml 仍然无法执行此操作:
<?xml version="1.0" encoding="UTF-8"?>
<body>
<seg>
text 1
</seg>
<seg>
text 2
</seg>
</body>
Run Code Online (Sandbox Code Playgroud)
因为它会改变内部文本节点的内容<seg>
。
您可能想尝试tidy,尽管我不确定它会做您想要的事情。
归档时间: |
|
查看次数: |
11422 次 |
最近记录: |