使用SAX进行XML解析| 如何处理特殊字符?

我们有一个JAVA应用程序,它从SAP提取数据,解析它并呈现给用户。 使用JCO连接器拉取数据。

最近我们被抛出一个例外:

org.xml.sax.SAXParseException: Character reference "&#00" is an invalid XML character. 

因此,我们计划在解析XML之前编写一个新的间接级别,其中替换所有特殊/非法字符。

我的问题是:

  1. 是否有任何现有的(开源)实用程序可以替换XML中的非法字符?
  2. 或者如果我必须编写这样的实用程序,我应该如何处理它们?
  3. 为什么抛出上述exception?

谢谢。

从我的角度来看,源(SAP)应该进行替换。 否则,它传输到您的程序可能看起来像XML,但不是。

将’&’替换为’&’可以通过简单的String.replaceAll(…)替换为字符串from to toXML()调用,其他字符可能更难替换(’<'和'>‘举个例子)。

关于纪尧姆

这听起来像是逃跑中的一个错误。 根据上下文,您可能最好只编写自己的XMLWriter类版本,该类使用真正的XML库,而不是像SAP开发人员那样编写自己的XML实用程序。

或者,查看字符代码&#00,您可以使用空字符串替换全部替换:

 String goodXml = badXml.replaceAll("�", ""); 

我有一个相关但相反的问题 ,我试图将字符1插入到XSLT转换的输出中。 我考虑使用零替换标记的后处理,而是选择使用xsl:param。

如果我在你的情况下,我要么想出一个定制的编码,替换XML中无效的字符,并在解析时将它们作为特殊情况处理,或者如果可能的话,用空格替换它们。

我没有JCO的经验,所以不能建议我如何或在哪里替换无效字符。

您可以使用Apache Commons Lang类StringEscapeUtils escapeXML方法对XML中的非ASCII字符进行编码/解码。 看到:

http://commons.apache.org/lang/api-2.4/index.html

要了解XML字符引用的工作原理,请在维基百科上搜索“数字字符引用”。