Velocity模板中XmlTool遍历DOM节点文本拼接异常求助
解决Velocity XmlTool中节点文本拼接问题
首先,问题的根源在于Velocity Tools 2.0的XmlTool对同名子节点的处理逻辑:当你通过$bar.baz访问节点时,即使当前<bar>下只有一个<baz>,XmlTool也会将其封装为一个节点集合(这是为了兼容多个同名子节点的场景)。直接调用.text属性时,会自动遍历集合中所有节点并拼接它们的文本内容,这就导致了你看到的“拼接所有兄弟节点文本”的问题。
接下来提供几种可行的解决方法:
方法1:通过索引访问集合中的第一个节点
因为每个<bar>下只有一个<baz>和<qux>,你可以直接取集合的第一个元素来获取单个节点的文本:
#if($xml.foo) <document> #foreach($bar in $xml.foo) <repeatableElement> <aaa>$bar.baz[0].text</aaa> <bbb>$bar.qux[0].text</bbb> </repeatableElement> #end </document> #end
方法2:使用XmlTool的getChild()方法直接获取单个子节点
XmlTool提供了getChild(String nodeName)方法,它会返回当前节点下第一个匹配名称的子节点(正好符合你的场景),然后调用getText()获取文本:
#if($xml.foo) <document> #foreach($bar in $xml.foo) <repeatableElement> <aaa>$bar.getChild("baz").getText()</aaa> <bbb>$bar.getChild("qux").getText()</bbb> </repeatableElement> #end </document> #end
方法3:使用selectSingleNode()精准定位节点
如果你需要更灵活的节点选择,可以用XPath表达式结合selectSingleNode()方法,相对于当前<bar>节点定位子节点:
#if($xml.foo) <document> #foreach($bar in $xml.foo) <repeatableElement> <aaa>$bar.selectSingleNode("./baz").text</aaa> <bbb>$bar.selectSingleNode("./qux").text</bbb> </repeatableElement> #end </document> #end
这三种方法都能帮你单独获取每个叶子节点的文本,得到你期望的输出格式。
内容的提问来源于stack exchange,提问作者blackgreen
相关产品推荐
相关产品推荐

