我有一个XML文件,它是数据库的输出.我正在使用Java SAX解析器来解析XML并以不同的格式输出它.XML包含一些无效字符,解析器抛出"无效的Unicode字符(0x5)"之类的错误
除了预先处理文件并替换它们之外,有没有一种方法可以去除所有这些字符?到目前为止,我遇到了3个不同的无效字符(0x5,0x6和0x7).这是一个~4gb的数据库转储,我们将要处理它多次,所以每次我们得到一个新的转储来运行一个预处理器时,不得不再等30分钟,这将是一个痛苦,这不是我第一次遇到这个问题.
我用过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(); }
我没有亲自使用过这个,但是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,并删除无效字符.
我使用下面的正则表达式似乎与JDK6的预期一样:
Pattern INVALID_XML_CHARS = Pattern.compile("[^\\u0009\\u000A\\u000D\\u0020-\\uD7FF\\uE000-\\uFFFD\uD800\uDC00-\uDBFF\uDFFF]"); ... INVALID_XML_CHARS.matcher(stringToCleanup).replaceAll("");
在JDK7中,可以使用符号表示\x{10000}-\x{10FFFF}
位于BMP之外的最后一个范围,而不是\uD800\uDC00-\uDBFF\uDFFF
那些不易理解的符号.