2012-07-05 38 views
0

我试图将org.w3c.dom.Document对象的内容转换为字符串。我得到在JBrowser组件中显示的当前页面的Document对象。将文档dom树转换为字符串的最常见方法似乎是使用javax.xml.transform.Transformer。所以,我实现了这一点:HTML DOM树到字符串 - 变压器NullPointerException

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 

TransformerFactory.newInstance().newTransformer().transform(
      new DOMSource(aDocument), new StreamResult(baos)); 

return baos.toString(); 

这适用于简单的网站,但更复杂,他们获得更高我的概率得到此异常:

ERROR: '' 
05.07.2012 10:17:09 com.de.test.Demonstrator$1 run 
FATAL: null 
javax.xml.transform.TransformerException: java.lang.NullPointerException 
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:717) 
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:313) 
at com.de.test.DocumentUtils.toHTML(DocumentUtils.java:47) 
at com.de.test.Demonstrator$1.run(Demonstrator.java:172) 
Caused by: java.lang.NullPointerException 
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:178) 
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:226) 
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:226) 
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:226) 
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:226) 
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:226) 
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:226) 
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:226) 
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:226) 
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:226) 
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:226) 
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:226) 
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:226) 
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:226) 
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:226) 
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:226) 
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:226) 
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:226) 
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:132) 
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:94) 
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transformIdentity(TransformerImpl.java:662) 
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:708) 
... 3 more 
--------- 
java.lang.NullPointerException 
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:178) 
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:226) 
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:226) 
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:226) 
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:226) 
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:226) 
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:226) 
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:226) 
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:226) 
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:226) 
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:226) 
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:226) 
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:226) 
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:226) 
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:226) 
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:226) 
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:226) 
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:226) 
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:132) 
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(DOM2TO.java:94) 
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transformIdentity(TransformerImpl.java:662) 
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:708) 
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:313) 
at com.de.test.DocumentUtils.toHTML(DocumentUtils.java:47) 
at com.de.test.Demonstrator$1.run(Demonstrator.java:172) 

经过一番研究发现了暗示,某些文本元素可能为空,导致Transformer崩溃。所以我只是这样做的:

public static final void traverseLevel(TreeWalker walker, Document aDocument, String indent) 
{ 
    // describe current node: 
    Node parent = walker.getCurrentNode(); 

    if (parent != null && parent.getNodeValue() == null) 
     parent.setNodeValue(" "); 

    System.out.println(indent + "- <" + ((Element) parent).getTagName() + ">" + parent.getNodeValue()); 

    // traverse children: 
    for (Node n = walker.firstChild(); n != null; n = walker.nextSibling()) 
    { 
     if(n != null) 
      traverseLevel(walker, aDocument, indent + '\t'); 
    } 

    System.out.println("</"+ ((Element) parent).getTagName() + ">"); 

    // return position to the current (level up): 
    walker.setCurrentNode(parent); 
} 

这是我发现“parent.getNodeValue()”总是返回null的地方。有趣的是,这个问题也发生在简单的网站上,但转换器仍然输出树的值。任何想法我的替换空文本节点有什么问题?是否还有其他可能导致此问题的潜在问题?

谢谢!

回答

0

好吧,我找到了解决我的问题的方法。我已将JBrowser更改为具有convertToHtml()函数的DJ Project浏览器。我无法解决Transformer问题,这就是为什么我采取了这条路线。