2010-01-07 134 views
22

我正在修复关于DocumentBuilder.parse的现有代码上的错误。我有下面的代码:DocumentBuilder.parse(InputStream)返回null

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变量有效值。请帮忙。

谢谢!

+2

只是为了说明:你有'(xmlDoc == null)= true'还是你得到一个空文件('[[#document:null]')?解析方法应该返回一个文档或抛出一个异常,但永远不会返回'null' ... – 2010-01-07 08:39:26

+0

hi Adreas, 我得到[#document:null] – 2010-01-07 08:53:30

+10

'[#document:null]'不代表空文档,这只是'Document'的'toString()'输出写得很糟糕。 – skaffman 2010-01-07 09:57:41

回答

40

流很有可能已被解析正确,只是因为 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)。

+0

这种方法会在这些情况下返回null还是抛出异常? 'DocumentBuilder.parse(InputStream的)' – 2016-06-06 20:49:35