如何在Java中从org.w3c.dom.Node获取HTML?

3
我已经构建了一种方法,使用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作为String获取HTML?我在文档中找不到任何相关信息。
仅供澄清:我需要作为字符串的内部HTML(带或不带节点元素/标记)。类似于http://api.jquery.com/html/http://jsoup.org/apidocs/org/jsoup/nodes/Element.html#html--

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

2
要使用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的树模型中,因此无法访问它。


需要更多的点赞,对我帮助很大。 - urmat abdykerimov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接