在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表示法,这并不那么简单理解。

链接地址: http://www.djcxy.com/p/34905.html

上一篇: Stripping Invalid XML characters in Java

下一篇: Make DocumentBuilder.parse ignore DTD references