You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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");

关键改动说明

  1. 提前开启格式化:在load()XML文件之前就设置formatOutput = true和preserveWhiteSpace = false,让DOM在加载原有内容和添加新节点时都自动处理缩进格式。
  2. 精准选择根节点:用documentElement直接获取XML的根元素,或者用getElementsByTagName('datetimes')->item(0)定位你需要的根节点,避免lastChild带来的不确定性。
  3. 统一根节点名称:根据你的预期输出调整了根节点为<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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:09:18