是否有 ANT 的 XMLTask 的替代方案可以在不更改文件结构的情况下进行 XML 替换?

发布于 2024-12-19 03:41:47 字数 325 浏览 2 评论 0原文

当使用 Groovy 的 XMLParser(以及类似的 API)来更改 XML 中文本节点的内容时,它会在解析文件时以及写回文件时丢失整体结构。即空格发生变化,注释被删除,dtd 引用被删除。

存在一个名为 XMLTask 的 ANT 库,它允许在 XPath 的帮助下进行简单的替换并维护文件的整体结构。 Java、Groovy、Jython 或朋友中是否有一些类似且易于使用的 API 允许这样做? 最好是 Groovy,因此它与 Gradle 集成得很好。

When using XMLParser of Groovy (and smiliar APIs) to change a text-node's content in an XML, it will loose the overall structure while parsing the file and thus when written back to a file. I.e. the spaces change, comments are removed, dtd-references are stripped.

There exists an ANT library called XMLTask that allows to do simple replacements with the help of XPath and maintains the overall structure of the file. Is there some similar and easy-to-use API in Java, Groovy, Jython or friends that allows this?
Preferably Groovy, so it integrates well with Gradle.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

难忘№最初的完美 2024-12-26 03:41:47

您可以将 xmltask 放在类路径上,并使用 groovy 的 AntBuilder。有一个我相信的示例

You could just stick xmltask on the classpath, and use groovy's AntBuilder. There's an example of this here I believe

享受孤独 2024-12-26 03:41:47

我发现 groovy 中的 DOMBuilder 实际上保留了输入文件中的结构、注释和模式引用:

import groovy.xml.DOMBuilder
import groovy.xml.XmlUtil
import static javax.xml.xpath.XPathConstants.*
import javax.xml.xpath.*

def doc = DOMBuilder.parse(new StringReader(new File("ejb-jar.xml").getText()), false, false).documentElement

use(groovy.xml.dom.DOMCategory) {
    nodes= doc.xpath( "//session/ejb-name[text()='EmployeeFacade']/../description", NODESET)
    println nodes.getLength()
    nodes.each{ 
        it.value = "TEST"
    }
}

def result = XmlUtil.serialize(doc)
println result

没想到会起作用...

I found that the DOMBuilder in groovy actually keeps the structure, comments and schema references as from the input file:

import groovy.xml.DOMBuilder
import groovy.xml.XmlUtil
import static javax.xml.xpath.XPathConstants.*
import javax.xml.xpath.*

def doc = DOMBuilder.parse(new StringReader(new File("ejb-jar.xml").getText()), false, false).documentElement

use(groovy.xml.dom.DOMCategory) {
    nodes= doc.xpath( "//session/ejb-name[text()='EmployeeFacade']/../description", NODESET)
    println nodes.getLength()
    nodes.each{ 
        it.value = "TEST"
    }
}

def result = XmlUtil.serialize(doc)
println result

Did not expect that to work...

温柔一刀 2024-12-26 03:41:47

普通 java 中也有 XPath 匹配器 http://www.ibm.com /developerworks/library/x-javaxpathapi/index.html

有关示例,请参阅清单 7. 使用名称空间的 XPath 查询
主要理论是您编写一个匹配器并循环结果。

There are XPath matchers in plain java too http://www.ibm.com/developerworks/library/x-javaxpathapi/index.html

See the Listing 7. XPath query that uses namespaces for an example.
The main theory is that you write a matcher and loop through the results.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文