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

Posted

技术标签:

【中文标题】使用 SAX 解析 XML |如何处理特殊字符?【英文标题】:XML parsing with SAX | how to handle special characters? 【发布时间】:2011-01-28 21:32:21 【问题描述】:

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

最近我们被抛出了一个异常:

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

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

我的问题是:

    是否有任何现有的(开源)实用程序可以完成这项工作以替换 XML 中的非法字符? 或者如果我必须编写这样的实用程序,我应该如何处理它们? 为什么会抛出上述异常?

谢谢。

【问题讨论】:

那么来自 JCO 的数据是 XML 格式吗?您正在解析它吗?或者您是在获取名称或其他内容,然后将其写入 XML 文档,然后进行解析? @Tom:JCO 有 Record.toXML() 方法,以 XML 格式提供数据。 只是出于好奇 - 是否有特殊原因导致您经历了将数据转换为 XML 然后再返回的所有痛苦和 CPU 周期? @vwegert:好问题。让我承认我们不知道迭代 JCO.Fields 的 JCO API,并认为 toXML() 可能只是我们的工作。 ...好的。我真的不知道该说什么。抱歉,JCo 附带 API 文档、示例程序和 PDF 教程。有人没有阅读并理解如何使用它,而是认为“让我们在其中添加一些 XML”。真的不知道该笑还是该哭…… 【参考方案1】:

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

虽然将 '&' 替换为 '&' 可以通过对字符串 from to toXML() 调用的简单 String.replaceAll(...) 来完成,但其他字符可能更难替换('' 为例)。

问候 纪尧姆

【讨论】:

【参考方案2】:

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

或者,查看字符代码 ,您也许可以将其全部替换为空字符串:

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

【讨论】:

【参考方案3】:

我有一个related, but opposite problem,我试图将字符 1 插入到 XSLT 转换的输出中。我考虑过用零替换标记的后处理,但选择使用 xsl:param。

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

我没有使用 JCO 的经验,因此无法建议如何或在何处替换无效字符。

【讨论】:

【参考方案4】:

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

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

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

【讨论】:

以上是关于使用 SAX 解析 XML |如何处理特殊字符?的主要内容,如果未能解决你的问题,请参考以下文章

whatsapp 是如何处理特殊字符、unicode 和 emoji 的

如何处理JSON中的特殊字符

SAX 的 characters() 方法未解析 Text 节点中的特殊字符

复制到 Redshift 时,如何处理 CSV 中的特殊字符?

[IT学习]Python如何处理异常特殊字符

如何处理jQuery选择器中的特殊符号