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
相关产品推荐
相关产品推荐

