4

我已经使用 JAXP 构建了一个文档,如下所示:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.newDocument();
Element rootElement = document.createElement("Root");

for (MyObject o : myCollection) {
    Element entry = document.createElement("Entry");
    Element entryItem = document.createElement("EntryItem");
    entryItem.appendChild(document.createTextNode(o.getProperty()));

    entry.appendChild(entryItem);
    rootElement.appendChild(entry);
}

document.appendChild(rootElement);

现在,当我尝试像这样输出文档的 XML 时:

Transformer transformer = TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
DOMSource source = new DOMSource(document);
StreamResult result = new StreamResult(new StringWriter());
transformer.transform(source, result);
System.out.println(result.getWriter().toString());

transformer.transform它因以下错误而分崩离析:

FATAL ERROR:  'java.lang.NullPointerException'
       :null

我该如何调试呢?我已经确定了transformersource并且result不为空。

4

2 回答 2

2

我猜这是:

entryItem.appendChild(document.createTextNode(o.getProperty()));

创建了一个具有空值的文本节点。查看 Xerces 的代码(这是 Oracle 的 JDK 1.6 附带的默认 JAXP 实现),我发现在构建文本节点时没有进行空验证。我怀疑这会导致Transformer死亡。

要么,要么存在一些 JAXp 配置问题。

您可能希望设置jaxp.debug系统属性(可用 JDK 1.6+)来获取一些 JAXP 跟踪信息。

于 2010-10-23T05:59:29.447 回答
0

——文件呢?

糟糕,抱歉,显然第二部分在第一部分之后 :) 你使用的是哪个解析器?

于 2010-10-09T16:12:58.217 回答