在Scala中使用XPath修改指定XML节点内容的技术需求
替换XML中指定XPath节点的解决方案
嘿,我来帮你搞定这个XML节点替换的需求!你需要把目标XML里通过doc("videos")("vid")定位到的<vid>Head</vid>节点,替换成<video type="usb">one</video>。下面我用Groovy(因为你的代码写法很像Groovy的XML处理风格)来演示具体操作步骤:
原始XML文档
首先先明确我们要处理的原始XML:
<library> <videos> <vid>Head</vid> <video type="dvd">Seven</video> <video type="blue-ray">The fifth element</video> <video type="hardcover">Gardens of the moon</video> </videos> <books> <book type="softcover">Memories of Ice</book> </books> </library>
具体实现代码
这里用Groovy的XmlSlurper和replaceNode方法来完成替换,完全匹配你指定的XPath路径:
// 解析原始XML def doc = new XmlSlurper().parseText(''' <library> <videos> <vid>Head</vid> <video type="dvd">Seven</video> <video type="blue-ray">The fifth element</video> <video type="hardcover">Gardens of the moon</video> </videos> <books> <book type="softcover">Memories of Ice</book> </books> </library> ''') // 通过指定的XPath路径定位目标节点 def targetNode = doc("videos")("vid") // 替换节点:直接用新的video节点覆盖原vid节点 targetNode.replaceNode { video(type: 'usb', 'one') } // 格式化输出处理后的XML def printer = new XmlNodePrinter(new PrintWriter(System.out)) printer.preserveWhitespace = true printer.print(doc)
处理后的结果
运行上面的代码后,你会得到替换后的XML:
<library> <videos> <video type="usb">one</video> <video type="dvd">Seven</video> <video type="blue-ray">The fifth element</video> <video type="hardcover">Gardens of the moon</video> </videos> <books> <book type="softcover">Memories of Ice</book> </books> </library>
其他语言的思路参考
如果是用Java(比如JDOM2、DOM API)或者其他支持XML操作的语言,核心思路都是一致的:
- 用XPath定位到目标节点
- 创建带有指定属性和内容的新节点
- 移除原节点,将新节点插入到原节点的位置
内容的提问来源于stack exchange,提问作者s.Doe
相关产品推荐
相关产品推荐

