【问题标题】:Building a DOM Document with tagsoup使用 tagoup 构建 DOM 文档
【发布时间】:2011-05-04 01:30:37
【问题描述】:

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

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

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();
 }

【问题讨论】:

    标签: java html parsing dom


    【解决方案1】:

    来自getOwnerDocument上的文档:

    当此节点是 Document 或 DocumentType 尚未与任何 Document 一起使用时,此为 null。

    由于在您的情况下getDOM 应该返回Document,您可以简单地转换返回值或将doc 的类型更改为Document

    【讨论】:

    • 我阅读了那个文档,但我没有意识到 Document 是 Node 的子接口 - 现在我有了大局,谢谢
    【解决方案2】:

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

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

    【讨论】:

    • 你说得对,我不知道 Node.tostring 打印父文档。无论如何,我现在有获取文档而不是节点的问题......因为 doc.getOwnerDocument() 返回 null (我认为这是获取文档的正确方法)
    • 就这样投吧:return (Document)doc
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    • 2012-03-24
    • 1970-01-01
    • 2010-10-22
    相关资源
    最近更新 更多