【发布时间】:2013-09-26 22:46:33
【问题描述】:
在我的 Grails 应用程序中,我使用 Groovy 的 XmlParser 来解析 XML 文件。我的 XML 文件中的一个属性的值是一个字符串,它等于一个字符十六进制代码。我想将该字符串保存在我的数据库中:
Ñ
不幸的是,attribute 方法返回 Ñ 字符,而实际存储在数据库中的是c391。当该字段被读回时,我还会得到不想要的 Ñ 字符。
如何将十六进制代码作为字符串存储在我的数据库中,并确保它也作为十六进制代码被读回?
更新 #1:
这对我来说是个问题的原因是,一旦我将 XML 文件读入我的数据库,我必须能够完全按照它的原样重建它。另一个问题是有问题的字段并不总是字符十六进制代码。它可能只是一些任意字符串。
更新 #2:
我想字符在数据库中的存储方式并不重要,只要我能以扩展的十六进制代码格式将其写回即可。我正在使用 Groovy MarkupBuilder 从数据库中重建我的 XML 文件,但我不清楚为什么默认情况下不会发生这种情况。
更新 #3:
我在我的自定义 MySQL 方言中覆盖了 getTableTypeString,这似乎对某些事情有所帮助。至少现在我传递给 MySQL 的值是存储在数据库中的值。
class CustomMySQL5InnoDBDialect extends MySQL5InnoDBDialect {
@Override
public String getTableTypeString() {
return " ENGINE=InnoDB DEFAULT CHARSET=utf8"
}
}
我还创建了自己的groovy.util.XmlParser 版本。我的版本几乎与groovy.util.XmlParser 完全相同,只是在startElement 方法中我更改了:
String value = list.getValue(i)
到这里:
def value = list.fAttributes.fAttributes[i].nonNormalizedValue
if(value ==~ /&#x([0-9A-F]+?);/) {
value = list.fAttributes.fAttributes[i].nonNormalizedValue
}
这允许将十六进制代码元素的确切文本存储在数据库中。
现在有两个新问题,可能三个。
使用存储在数据库中的确切值重新创建文件。到目前为止,我一直在使用
MarkupBuilder,但这是对 & 符号进行额外编码,导致值Ñ被写为Ñ我可能可以通过放弃MarkupBuilder并构建我的 XML 字符串来解决这个问题手动,但我不想这样做。使用 Saxon-HE 9.4 处理器对 XML 文件运行 XSLT 转换会导致某些十六进制代码值(例如
ÿ)更改为类似 ÿ 的值,而其他值则类似于 @ 987654338@ 保持不变。我不确定这是否会成为问题,但是当我重新创建文件时,我希望它采用
ANSI编码,因为这是用于原始文件的编码.
【问题讨论】:
标签: xml grails groovy xml-parsing xml-entities