在Java中剥离无效的XML字符
我有一个XML文件,它是数据库的输出。 我正在使用Java SAX解析器来解析XML并以不同的格式输出它。 XML包含一些无效字符,解析器抛出错误,如'无效的Unicode字符(0x5)'
除了预先逐行处理文件并替换它们之外,是否有一种很好的方法可以去除所有这些字符? 到目前为止,我已经遇到了3个不同的无效字符(0x5,0x6和0x7)。 这是一个大约4GB的数据库转储,我们将要处理它很多次,所以每次我们得到一个新的转储以运行预处理器时,必须等待额外的30分钟,这将是一个痛苦,这不是我第一次遇到这个问题。
我没有亲自使用过,但Atlassian提供了一个可以满足您需求的命令行XML清理器(主要针对JIRA,但XML是XML):
下载atlassian-xml-cleaner-0.1.jar
打开DOS控制台或shell,找到计算机上的XML或ZIP备份文件,这里假设为data.xml
运行:java -jar atlassian -xml-cleaner-0.1.jar data.xml> data-clean.xml
这会将data.xml的副本写入data-clean.xml,并删除无效字符。
我使用Xalan org.apache.xml.utils.XMLChar
类:
public static String stripInvalidXmlCharacters(String input) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < input.length(); i++) {
char c = input.charAt(i);
if (XMLChar.isValid(c)) {
sb.append(c);
}
}
return sb.toString();
}
我使用了以下正则表达式,它可以像JDK6一样按预期工作:
Pattern INVALID_XML_CHARS = Pattern.compile("[^u0009u000Au000Du0020-uD7FFuE000-uFFFDuD800uDC00-uDBFFuDFFF]");
...
INVALID_XML_CHARS.matcher(stringToCleanup).replaceAll("");
在JDK7中,可能会使用记号x{10000}-x{10FFFF}
作为位于BMP之外的最后一个范围,而不是uD800uDC00-uDBFFuDFFF
表示法,这并不那么简单理解。