PHP DomDocument更新XML格式异常问题求助
解决PHP更新XML时的格式缩进问题
我来帮你搞定这个XML格式的问题!你遇到的情况是因为DOMDocument的格式化选项设置时机不对,还有节点选择的小问题,咱们一步步来修正:
问题根源分析
- 你在添加完节点后才设置
formatOutput = true,这时候DOM已经把新节点添加进去了,不会再对它进行格式化处理。 - 使用
$xml->lastChild来获取根节点不可靠,因为XML文件里的空白字符会被解析成文本节点,lastChild可能指向的是这些空白节点而非真正的根元素。 - 另外注意到你的预期输出根节点是
<datetimes>,但原有XML和代码里用的是<root>,我会在代码里统一调整成符合预期的结构。
修正后的代码
$file = 'DEFAULT_DATE_CONVERSION4.xml'; $xml = new DOMDocument(); // 提前设置格式化相关参数,确保加载和修改过程中都能处理格式 $xml->preserveWhiteSpace = false; $xml->formatOutput = true; $xml->load($file); // 获取目标根节点(这里匹配你预期的<datetimes>,如果原有XML根是<root>,就用下面注释的行) $root = $xml->getElementsByTagName('datetimes')->item(0); // $root = $xml->documentElement; // 原有根是<root>时用这行 // 创建新的testing节点并添加子元素 $app = $xml->createElement('testing'); $testtext = "test"; $app->appendChild($xml->createElement('test', $testtext)); $app->appendChild($xml->createElement('test1', $testtext)); $app->appendChild($xml->createElement('test2', $testtext)); $app->appendChild($xml->createElement('test3', $testtext)); // 将新节点添加到根节点内部 $root->appendChild($app); // 保存处理后的XML文件 $xml->save("test.xml");
关键改动说明
- 提前开启格式化:在
load()XML文件之前就设置formatOutput = true和preserveWhiteSpace = false,让DOM在加载原有内容和添加新节点时都自动处理缩进格式。 - 精准选择根节点:用
documentElement直接获取XML的根元素,或者用getElementsByTagName('datetimes')->item(0)定位你需要的根节点,避免lastChild带来的不确定性。 - 统一根节点名称:根据你的预期输出调整了根节点为
<datetimes>,如果原有XML的根是<root>,只需要切换注释行即可。
验证后的输出
运行修正后的代码,你会得到和预期完全一致的格式化XML:
<?xml version="1.0" encoding="UTF-8"?> <datetimes> <testing> <test>test</test> <test1>test1</test1> <test2>test2</test2> <test3>test3</test3> </testing> <testing> <test>test</test> <test1>test1</test1> <test2>test2</test2> <test3>test3</test3> </testing> <testing> <test>test</test> <test1>test1</test1> <test2>test2</test2> <test3>test3</test3> </testing> <testing> <test>test</test> <test1>test</test1> <test2>test</test2> <test3>test</test3> </testing> </datetimes>
内容的提问来源于stack exchange,提问作者DutchFlow
相关产品推荐
相关产品推荐

