XmlSlurper转换html编码的符号

时间:2016-08-29 11:53:02

标签: xml parsing gradle groovy

DOC.Body.getElementById('i0116').value = 'test'

下一个打印:

def xmlNode = new XmlSlurper().parseText('<?xml version="1.0" encoding="utf-8"?><b>&#8240;</b>')
println XmlUtil.serialize(xmlNode)

是否可以阻止将<?xml version="1.0" encoding="UTF-8"?> <b> ‰ </b> 转换为&#8240;文档什么也没说。

1 个答案:

答案 0 :(得分:2)

我写了一个POC覆盖XmlSlurper.characters来处理字符实体。还需要Apache commons StringEscapeUtils转换回实体代码:

@Grab(group='commons-lang', module='commons-lang', version='2.6')

import org.apache.commons.lang.StringEscapeUtils as SE
import groovy.xml.XmlUtil

def parser = new XmlSlurper() {
    void characters(char[] buffer, int start, int length)  {
        def entity = SE.escapeXml(buffer[start].toString())
        super.characters entity.toCharArray(), start, entity.size() 
    }
}

def xml = parser.parseText '<?xml version="1.0" encoding="utf-8"?><b>&#8240;</b>'

def serialized = SE.unescapeXml( XmlUtil.serialize(xml) )
assert '<?xml version="1.0" encoding="UTF-8"?><b>&#8240;</b>\n' == serialized

注意这是处理单个字符,如果需要多字符处理,可能需要稍微调整一下。另请注意,在assert中需要换行。它是由XmlUtil.serialize

添加的

不知道这是否是最佳方式。