如何从java中的org.w3c.dom.Node获取html?

时间:2015-11-10 16:57:39

标签: java dom xpath saxon

我构建了一个使用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作为String?我在文档中找不到任何相关内容。

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

1 个答案:

答案 0 :(得分: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的树模型中,没有办法访问它。