E4X(Rhapsody)遍历通用子节点:最底层后代处理异常
E4X递归遍历XML的节点丢失问题
场景复现
给定如下XML结构:
<Level1> <Level2> <Level3> <Level4> Level 4 Inner Text </Level4> </Level3> </Level2> </Level1>
使用Rhapsody强制要求的E4X编写递归遍历函数:
function iterateXML(xml) { log.info(xml.name()); // 功能类似console.log for each (var child in xml.*) { // .* 用于获取所有子节点 iterateXML(child); } }
预期输出
Level1 Level2 Level3 Level4 // 异常:传入Level4的文本内容,无.name()方法
实际输出
Level1 Level2 Level3 // 异常:传入Level4的文本内容,无.name()方法
核心问题
当通过xml.*获取子节点时,若目标节点仅包含文本内容、无后代节点,E4X不会返回该XML节点本身,而是直接返回其文本值。这导致最底层节点(比如上述的Level4)无法被遍历到,无论层级是Level2还是Level100,都会出现此问题——例如<lowestNode>SomeValue</lowestNode>,xml.*只会返回SomeValue而非<lowestNode>节点。
补充验证案例
再看另一组XML:
<Root> <Child> <GrandChild>Value1</GrandChild> </Child> <Child> Value2 </Child> </Root>
执行遍历代码:
function iterateXML(xml) { for each (var child in xml.*) { // .* == 获取所有子节点 log.info(child.toString()); } }
输出结果
<Child><GrandChild>Value1</GrandChild></Child> Value2
可见:包含后代XML节点的<Child>被完整返回;仅含文本的<Child>则仅返回文本内容,处理逻辑明显不一致。
内容的提问来源于stack exchange,提问作者Suamere
相关产品推荐
相关产品推荐

