在Groovy中对Xml进行反转义

3

我正在尝试在Groovy中取消转义XML:

<student><age value="20"></age></student>

to

 <student><age value="20"></age></student>

但我找不到任何可以实现此功能的库。我尝试使用 groovy.json.StringEscapeUtils.unescapeJavaScript,但这并没有帮助。

有一个名为 groovy.xml.XmlUtil 的库,其中包含有 escapeXml 方法,但它没有 unescape 方法。

我的使用目的是在 Elasticsearch v1.3.2 中使用此 groovy 脚本,其中包含 groovy-all-2.3.2.jar

有什么建议吗?


你的意思应该是'转义'。 - tim_yates
非常抱歉,实际上我只是想说UnEscape,但之前因为错误地颠倒了输入和输出(现已更正)。 - Tushar Khanna
3个回答

6
您可以直接使用Apache的Commons Lang库来实现这一功能。
// For Grails (2), add:
//
//     compile 'org.apache.commons:commons-lang3:3.3'
//
// to your build config. For a groovy script, we can do:

@Grab('org.apache.commons:commons-lang3:3.3')
import org.apache.commons.lang3.StringEscapeUtils

def xml = '&lt;student&gt;&lt;age value=&quot;20&quot;&gt;&lt;/age&gt;&lt;/student&gt;'

def unescaped = StringEscapeUtils.unescapeXml(xml)

比起编写和维护自己的代码,这更加容易;-)

实际上,我使用这个Groovy脚本是为了在包含Groovy jar的Elasticsearch v1.3.2中使用它。由于我不熟悉Grails,我不知道如何在您的代码中使用Grails(如果允许的话),如果可能的话,它将如何使用org.apache.commons-lang.StringUtils(我需要自己将jar放入Elasticsearch文件夹中吗)? - Tushar Khanna
你为什么把这个问题标记为Grails呢? - tim_yates
我的错,但是这是自动建议的,所以我想也许知道这个的人可以告诉我。我之前不知道Groovy和Grails之间的关系,只是之前听过Groovy和Grails这个名字。 - Tushar Khanna

3

这不是最高效和完整的解决方案,但我认为它可以胜任工作:

def s = '&lt;student&gt;&lt;age value=&quot;20&quot;&gt;&lt;/age&gt;&lt;/student&gt;'

def u = s.replaceAll(/&lt;/, '<')
         .replaceAll(/&gt;/, '>')
         .replaceAll(/&quot;/, '"')
         .replaceAll(/&apos;/, "'")
         .replaceAll(/&amp;/, '&')

assert u == '<student><age value="20"></age></student>'

谢谢您提供的解决方案,您能否告诉我为什么它不完整呢?在我看来,您已经处理了所有XML转义的情况。是这样吗? - Tushar Khanna

2

这里有一个技巧,使用内置的XmlSlurper类而不需要额外的库:

value = "X &amp; Y &lt; Z"
// wrap the string in made up tags to create
// well-enough-formed XML for the XmlSlurper
xml = "<foo>${value}</foo>"
println xml
root = new XmlSlurper().parseText(xml)
root.toString()

Result: 'X & Y < Z'


我尝试检查它是否有效,是的,它有效。谢谢。 - Tushar Khanna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接