XML 实体的单一输入源

public class InputSource
extends Object
XML 实体的单一输入源。

此模块(包括源代码和文档)在公共域中,同时 没有担保。有关更多信息,请参阅http://www.saxproject.org。
此类允许 SAX 应用程序封装有关单个对象中的输入源的信息,它可包括公共标识符、系统标识符、字节流(可能带有指定的编码)、基本 URI 和/ 或字符流。

在以下两种情况下应用程序可以将输入源提供给解析器:作为 Parser.parse 方法的参数,或者作为 EntityResolver.resolveEntity 方法的返回值。

SAX 解析器将使用 InputSource 对象来确定如何读取 XML 输入。如果有字符流可用,则解析器将直接读取该流,而忽略该流中找到的任何文本编码声明。如果没有字符流,但却有字节流,则解析器将使用该字节流,从而使 用在 InputSource 中指定的编码,或者另外(如果未指定编码)通过使用某种诸如 XML 规范 中的算法算法自动探测字符编码。如果既没有字符流,又没有字节流可用,则解析器将尝试打开到由系统标识符标识的资源的 URI 连接。

InputSource 对象属于该应用程序:SAX 解析器将不会以任何方式修改它(它可以在必要时修改副本)。但是,作为解析终止清除的一部分,对字节流和字符流的标准处理就是关闭这二者,因此在将此类流传递给解析器后应用程序不应尝试重新使用它们。


改进 InputSource 构造
InputSource inputSource = new InputSource(myInputStream);
inputSource.setSystemId("http://www.oreilly.com");
inputSource.setEncoding("UTF-8");

使用了 setEncoding() 方法来通知 SAX 解析器使用何种编码;在涉及国际化或使用多字节字符集的 XML 应用程序中,这一点很重要。

但是,这里产生了另一个问题:对于字符编码,用手工设置字符编码的编码与所提供的输入流(通过 java.io.InputStream 或 java.io.Reader )所用的编码 不同 ,这种情况很常见。如果这些编码不匹配,就可能发生各种解析问题。要避免这种情况,请始终用 Java InputStream 创建您的 InputSource ,而不要用 Reader 或 String 系统标识(这些都是 JAXP API 的可能选项)。当您提供 InputStream 时,SAX 实现将流封装在 InputStreamReader 中;然后 SAX 自动从流中检测正确的字符编码。随后,您可以省略 setEncoding() 步骤,再次减少方法调用。结果是应用程序运行更快了,并且字符编码始终正确。 使用 InputStream 向 SAX API 输入 XML 比将 Reader 用作输入明显更有效且更安全

posted on 2011-12-27 19:31  xtl  阅读(234)  评论(0编辑  收藏  举报

导航