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

MATLAB XML DOM操作异常:删除FlightCondition节点仅删半数且报错

MATLAB删除XML节点时仅删除隔一个节点并报错

问题场景

现有如下XML结构:

<ConfigFile>
   ...
   <ProgramSettings>
      ...
      <FlightConditions>
         <FlightCondition ID=1>
            <Mach>0.70</Mach>
            <Alitude>35000</Altitude>
         </FlightCondition>
         ...
         <FlightCondition ID=11>
            <Mach>0.78</Mach>
            <Altitude>35000</Altitude>
         </FlightCondition>
      </FlightCondtions> <!-- 注意:这里有拼写错误,应为FlightConditions -->
   </ProgramSettings>
</ConfigFile>

尝试用MATLAB删除所有11个FlightCondition节点,代码如下:

folder = 'path_to_folder';
config = xmlread(strjoin([folder, 'calculatePolar_conf.xml'],''));

flightConditionsNode = item(getElementsByTagName(config, 'FlightConditions'),0);
flightConditions = getElementsByTagName(flightConditionsNode, 'FlightCondition');

for k=0:flightConditions.getLength-1
   flightCondition = item(flightConditions,k);
   removeChild(flightConditionsNode, flightCondition);
end

xmlwrite(strjoin([folder,'output_config.xml'],''),config);

实际运行时,仅能删除每隔一个的节点,且在k=5时抛出错误,但flightConditions.getLength输出确实为11。

问题原因

getElementsByTagName返回的是动态DOM节点列表——当你删除一个节点后,这个列表的长度和节点索引会实时更新。比如初始长度为11,删除k=0的节点后,原来的k=1节点会自动变成新的k=0,但循环仍按初始的0:10执行,导致后续索引越界,同时跳过了部分节点。

解决方案

方法1:倒序遍历删除

从最后一个节点开始往前删,这样前面的节点索引不会被删除操作影响:

folder = 'path_to_folder';
% 用fullfile替代strjoin,更适配不同操作系统的路径格式
config = xmlread(fullfile(folder, 'calculatePolar_conf.xml'));

flightConditionsNode = item(getElementsByTagName(config, 'FlightConditions'),0);
flightConditions = getElementsByTagName(flightConditionsNode, 'FlightCondition');

% 倒序遍历节点索引
for k = flightConditions.getLength-1 : -1 : 0
    flightCondition = item(flightConditions,k);
    removeChild(flightConditionsNode, flightCondition);
end

xmlwrite(fullfile(folder,'output_config.xml'),config);

方法2:先转成静态数组再删除

先把动态节点列表转成静态数组,再遍历数组删除节点,避开动态列表的实时更新问题:

folder = 'path_to_folder';
config = xmlread(fullfile(folder, 'calculatePolar_conf.xml'));

flightConditionsNode = item(getElementsByTagName(config, 'FlightConditions'),0);
flightConditions = getElementsByTagName(flightConditionsNode, 'FlightCondition');

% 将动态节点列表转为静态数组
fcArray = [];
for k=0:flightConditions.getLength-1
    fcArray = [fcArray, item(flightConditions,k)];
end

% 遍历数组删除每个节点
for fc = fcArray
    removeChild(flightConditionsNode, fc);
end

xmlwrite(fullfile(folder,'output_config.xml'),config);

另外注意:原XML中的<FlightCondtions>存在拼写错误,应为<FlightConditions>,建议修正以避免后续潜在问题。

内容的提问来源于stack exchange,提问作者blockchain187

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 05:55:16