如何在Matlab中交替排列XML的LaneBorder与Lane节点?
解决XML节点交替排列的Matlab方案
你的问题根源在于getChildNodes返回的是动态节点集合——当你执行replaceChild或者修改节点结构时,这个集合会实时更新,导致你看到节点数量不断减少;而且直接替换节点的思路也不对,你需要的是把Lane节点移动到对应的LaneBorder节点之后,而不是替换掉原有节点。
下面是可行的实现代码,以及详细的步骤说明:
完整解决方案代码
% 获取文档中的Profiles节点集合 profilesNode = docNode.getElementsByTagName('Profiles'); % 获取第一个Profile目标节点 prof1 = profilesNode.item(0); % 将动态的NodeList转换为静态数组,避免操作时集合自动变化 % 收集所有LaneBorder节点 lbCount = prof1.getElementsByTagName('LaneBorder').getLength(); laneBorders = arrayfun(@(idx) prof1.getElementsByTagName('LaneBorder').item(idx), 0:lbCount-1); % 收集所有Lane节点 laneCount = prof1.getElementsByTagName('Lane').getLength(); lanes = arrayfun(@(idx) prof1.getElementsByTagName('Lane').item(idx), 0:laneCount-1); % 先把所有Lane节点从Profile中移除(原位置在LaneBorder之后,先移除再重新插入) for i = laneCount:-1:1 prof1.removeChild(lanes(i)); end % 遍历每个LaneBorder,在其后方插入对应的Lane节点 for i = 1:min(lbCount, laneCount) prof1.insertAfter(lanes(i), laneBorders(i)); end
代码说明
静态数组转换:
getElementsByTagName返回的NodeList是动态的,任何节点结构变化都会实时影响这个集合。我们用arrayfun把它转换成Matlab数组,这样后续操作时索引不会混乱。预先移除Lane节点:
原XML中所有Lane节点都在LaneBorder之后,直接插入会导致重复或者位置错误。先把所有Lane节点从父节点中移除,再逐个插入到目标位置,操作更可控。交替插入逻辑:
使用insertAfter方法,将第i个Lane节点插入到第i个LaneBorder节点的后面,完美实现你需要的交替排列效果。min(lbCount, laneCount)确保不会出现索引越界(如果两种节点数量不一致时只处理到较短的那组)。
为什么你的原代码会失败?
你用replaceChild时,会将目标位置的原有节点(比如空白节点或其他节点)替换成Lane节点,被替换的节点会被从DOM树中移除,所以节点总数会减少。这不是你需要的“移动节点”逻辑,而是替换节点,自然无法实现交替排列。
内容的提问来源于stack exchange,提问作者Girish Mohan
相关产品推荐
相关产品推荐

