【问题标题】:How to get html from a org.w3c.dom.Node in java?如何从 java 中的 org.w3c.dom.Node 获取 html?
【发布时间】:2016-02-11 15:35:38
【问题描述】:

我已经构建了一个使用 saxon-he 的 xpath 组件从 html 文档中提取数据的方法。我正在为此使用 w3c dom 对象模型。

我已经创建了一个返回文本值的方法,类似于来自 jsoup (jsoupElement.text()) 的文本值方法:

    protected String getNodeValue(Node node) {
    NodeList childNodes = node.getChildNodes();
    for (int x = 0; x < childNodes.getLength(); x++) {
        Node data = childNodes.item(x);
        if (data.getNodeType() == Node.TEXT_NODE)
            return data.getNodeValue();
    }
    return "";
 }

这工作正常,但我现在需要一个选定节点的底层 html(使用 jsoup 它将是 jsoupElement.html())。使用 w3c dom 对象模型我有 org.w3c.dom.Node。如何从 org.w3c.dom.Node 获取 html 作为字符串?我在文档中找不到与此相关的任何内容。

只是为了澄清:我需要将内部 html(带或不带节点元素/标签)作为字符串。类似http://api.jquery.com/html/http://jsoup.org/apidocs/org/jsoup/nodes/Element.html#html--

【问题讨论】:

  • 在 Java 中,您可以使用 LSSerializer 或使用默认的 Transformer 序列化子节点或节点本身,但是它们将为您提供 DOM 树的 XML 序列化,而不是原始 XML 或 HTML。
  • 感谢您的回答。是否可以使用另一个文档对象模型获取原始 html?我可以在这些模型之间进行选择:saxonica.com/documentation/index.html#!xpath-api/jaxp-xpath/…
  • 我不认为有任何方法可以从任何树模型中获取原始 HTML,它存储节点而不是标记。我对 jsoup 不熟悉,但如果您调用该方法来为您提供内部 HTML,他们也可能会序列化他们的树,只序列化为 HTML,而不是 XML。 Saxon 作为 XSLT 2 处理器支持 HTML 和 XHTML 序列化,其中 XSLT 样式表具有正确的输出方法(即&lt;xsl:output method="html"/&gt;&lt;xsl:output method="xhtml"/&gt;),因此您可以使用带有样式表的 Transformer,根据需要设置方法。也许 API 也提供了一些方法。
  • 我不能使用序列化的 html 输出,因为它可能与原始 html 不同,并且进一步的提取过程(正则表达式)可能与序列化的 html 不匹配。所以我必须寻找另一种解决方案或改变我进行提取的方式。非常感谢!
  • “原始 HTML”根本不存在被提取:它只能被重构,并且总会有微小的变化,例如重新排序属性。

标签: java dom xpath saxon


【解决方案1】:

要使用 Saxon 将 W3C DOM Node 的子节点序列化为 HTML,您可以使用默认的 Transformer,将输出方法设置为 html

public static String getInnerHTML(Node node) throws TransformerConfigurationException, TransformerException
{
    StringWriter sw = new StringWriter();
    Result result = new StreamResult(sw);
    TransformerFactory factory = new net.sf.saxon.TransformerFactoryImpl();
    Transformer proc = factory.newTransformer();
    proc.setOutputProperty(OutputKeys.METHOD, "html");
    for (int i = 0; i < node.getChildNodes().getLength(); i++)
    {
        proc.transform(new DOMSource(node.getChildNodes().item(i)), result);
    }
    return sw.toString();
}

但正如所说,这是树的序列化,原始的 XML 或 HTML 没有存储在 DOM 树或 Saxon 的树模型中,没有办法访问它。

【讨论】:

    猜你喜欢
    • 2011-06-30
    • 2013-08-01
    • 2023-03-08
    • 2011-06-03
    • 2014-10-09
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 2012-06-02
    相关资源
    最近更新 更多