【问题标题】:DocumentBuilder.parse(InputStream) returns nullDocumentBuilder.parse(InputStream) 返回 null
【发布时间】:2011-01-02 09:30:35
【问题描述】:

我正在修复有关 DocumentBuilder.parse 的现有代码的错误。我有以下代码:

 String theOutput;
    theOutput = response.encodeURL(prefix + "/include/sampleForConversion.jsp?" + request.getQueryString();
    StreamSource xmlSource = new StreamSource(new URL(theOutput).openStream(), "http://sampleApps.net/static/dataDef1.1.dtd");                                         
    Document xmlDoc = dBuilder.parse(xmlSource.getInputStream());

我不明白为什么我得到了 xmlDoc 的空值,尽管我有有效的 theOutput 和 xmlSource 变量值。请帮忙。

谢谢!

【问题讨论】:

  • 只是为了澄清:你有@​​987654323@还是一个空文件([#document: null])? parse 方法应该要么返回一个文档,要么抛出一个异常,但永远不会返回 null...
  • 嗨,Adreas,我得到 [#document: null]
  • [#document: null] 并不意味着一个空文档,那只是Document 的写得不好的toString() 输出。
  • @Andreas_D 您在哪里发现这种“永不返回 null”的行为记录在案?谢谢!
  • @WeishiZeng,它被exhaustive documentation覆盖。如果发生任何解析异常,它会抛出SAXExceptionIOException 如果发生任何 I/O 错误;如果输入为null,则为IllegalArgumentException。即使这并没有穷尽所有错误情况,在 JDK 中,@returns 文档中通常会提及 null(如果它是可能的返回值)。

标签: java xml


【解决方案1】:

流被正确解析的可能性很大,只是因为 xmlDoc.toString() 将永远是 "[#document: null]"。这并不表示 DOM 树是空的。请先检查文档是否有一些节点(子节点)。

如果 DOM 真的是空的,那么我首先将输入流的内容打印到控制台(可能xmlSource.getInputStream().toString() 已经返回内容)以检查内容是否格式正确,仔细检查是否dtd 文件可访问(浏览器),最后,将 XML 文档和 dtd 转储到文件中以检查 XML 内容是否有效。

啊,等一下,我以为第二个参数是DTD文件的URI,结果字符串是xml文档的systemId(public StreamSource(InputStream inputStream, String systemId))。也许这是个问题 - StreamSource 类将使用此 URI 来解析相对 URI(如您的 DTD)。

【讨论】:

  • 在这些情况下,此方法是否会返回 null 或抛出异常? DocumentBuilder.parse(InputStream)
  • 感谢您告诉我:xmlDoc.toString() 将始终为“[#document: null]”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-23
  • 1970-01-01
  • 2011-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-27
相关资源
最近更新 更多