2010-11-02 66 views
3

我无法使TagSoup正常工作。我使用的是后面的代码,但是当我打印由解析器返回的节点(带有System.err.println(doc);的行)时,我总是得到“[#document:null]”。使用tagsoup构建DOM文档

我不知道如何找到这个代码中的错误,或者,无论它是什么,问题的根源。请帮忙!

public final Document parseDOM(final File fileToParse) { 
    Parser p = new Parser(); 
    SAX2DOM sax2dom = null; 
    org.w3c.dom.Node doc = null; 

    try { 

     URL url = new URL("http://stackoverflow.com/"); 
     p.setFeature(Parser.namespacesFeature, false); 
     p.setFeature(Parser.namespacePrefixesFeature, false); 
     sax2dom = new SAX2DOM(); 
     p.setContentHandler(sax2dom); 
     p.parse(new InputSource(new InputStreamReader(url.openStream()))); 
     doc = sax2dom.getDOM(); 
     System.err.println(doc); 
    } catch (Exception e) { 
    // TODO handle exception 
    e.printStackTrace(); 
    } 


    return doc.getOwnerDocument(); 
} 

回答

3

从文档上getOwnerDocument

当此节点为Document为DocumentType其不与任何Document一起使用,这是空的。

因为你的情况应该返回DocumentgetDOM,你可以简单地将返回值或改变doc类型Document

+0

我读过那个文档,但是我没有意识到Document是Node的一个子接口 - 现在我有了大局,谢谢 – cdarwin 2010-11-02 17:29:20

1

您的解析器正在工作,但您无法打印出像这样的节点。打印出一个节点及其所有儿童的最简单方法是使用XML序列化是这样的:

  Writer out = new StringWriter(); 
      XMLSerializer serializer = new XMLSerializer(out, new OutputFormat()); 
      serializer.serialize(doc); 
      System.out.println(out.toString()); 
+0

你是对的,我不知道Node.tostring打印父文档。 无论如何,我现在得到一个文档,而不是一个节点的问题......作为doc.getOwnerDocument()返回null(我认为这是正确的方式来obetain一个文档) – cdarwin 2010-11-02 17:23:25

+1

只是像这样施放它:'return( Document)doc' – dogbane 2010-11-02 17:39:14