无法将字符串解析为文档

时间:2012-04-18 19:02:21

标签: java xml-parsing

任何人都可以告诉我这段代码如何导致空文档,但不抛出异常吗?

document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new InputSource(new StringReader("<?xml version=\"1.0\"?><company>test</company>")));

最初:

private Document load(String message) throws MessagingException, IOException {
    Document document = null;

    try {
        document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new InputSource(new StringReader(message.substring(message.indexOf(XML_BEGIN),
                                                                                                                                        message.indexOf(XML_END)))));
    }
    catch (Exception e) {
        e.printStackTrace();
    }
...
    Element element = document.getElementById(TIME_STAMP);

结果:

java.lang.NullPointerException
at ...view.MailReceiver.parse(MailReceiver.java:156)
at ...view.MailReceiver.notify(MailReceiver.java:99)
at ...view.MailReceiver.main(MailReceiver.java:72)

2 个答案:

答案 0 :(得分:1)

我认为该文档不是null

// Parse XML into Document.
String xml = "<?xml version=\"1.0\"?><company>test</company>";
Document document = DocumentBuilderFactory
    .newInstance()
    .newDocumentBuilder()
    .parse(new InputSource(new StringReader(xml)));

// Format Document to XML again. 
StringWriter writer = new StringWriter();
Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.transform(new DOMSource(document), new StreamResult(writer));

System.err.println(writer);

打印

<?xml version="1.0" encoding="UTF-8" standalone="no"?><company>test</company>

所以document不是空的。

打印document会向您[#document: null]提供null,因为它提到了document,这可能有点令人困惑。但是,这并不会使null本身{{1}}。

答案 1 :(得分:0)

在您的原始代码中,我怀疑由于子字符串稍微“关闭”而导致XML格式错误。
当你正在寻找你的“XML_END”字符串时,假设它实际上是你要解析的XML的一部分(例如“”作为一个随机的例子),你还必须添加这个字符串的长度,或者你会遗漏你的部分XML 此外,substring在endIndex上是独占的,所以你可能也需要+1。

要开始检查所有这些,我会将XML字符串(在子字符串之后)分配到变量中并使用log4j(或System.out.println)进行记录以查看。

在您的原始代码中,如果发生了解析异常,那么您正在使用空文档 - 不好!可能是您的NullPointerException的原因。通常你会在catch块中抛出一个异常。