在Java中剥离无效的XML字符
时间:2020-03-06 14:21:57 来源:igfitidea点击:
我有一个XML文件,它是数据库的输出。我正在使用Java SAX解析器来解析XML并以另一种格式输出它。 XML包含一些无效字符,并且解析器抛出诸如"无效Unicode字符(0x5)"之类的错误。
除了逐行预处理文件并替换它们之外,是否有一种很好的方法可以去除所有这些字符?到目前为止,我遇到了3个不同的无效字符(0x5、0x6和0x7)。这是一个约4gb的数据库转储,我们将对其进行大量处理,因此,每次我们有一个新的转储在其上运行预处理器时,都必须等待额外的30分钟,这不是我第一次遇到这个问题。
解决方案
我没有亲自使用它,但是Atlassian开发了一种命令行XML清理程序,它可以满足需求(它主要是为JIRA而设计的,但XML是XML):
Download atlassian-xml-cleaner-0.1.jar Open a DOS console or shell, and locate the XML or ZIP backup file on your computer, here assumed to be called data.xml Run: java -jar atlassian-xml-cleaner-0.1.jar data.xml > data-clean.xml This will write a copy of data.xml to data-clean.xml, with invalid characters removed.
是否有可能无效字符仅出现在值中,而不是标记本身,即XML在概念上符合架构,但值未得到正确清理?如果是这样,如何覆盖InputStream来创建CleansingInputStream,以将无效字符替换为XML等效字符?
问题与XML无关:它与字符编码有关。最终的结果是,每个字符串(无论是XML还是其他形式)都由字节组成,并且我们不知道这些字节代表什么字符,除非我们被告知编码字符串的字符是什么。例如,如果供应商告诉我们它是UTF-8,但实际上是其他东西,那么我们肯定会遇到问题。在最好的情况下,一切正常,但是某些字节被转换为"错误"字符。在最坏的情况下,我们会遇到与遇到的错误类似的错误。
实际上,问题甚至更糟:字符串包含不代表任何字符编码中的字符的字节序列。没有文本处理工具,更不用说XML解析器了。这需要字节级清除。