2015-11-10 77 views
1

我已經構建了一個使用saxon-he的xpath組件從html文檔中提取數據的方法。我爲此使用了w3c dom對象模型。如何從java中的org.w3c.dom.Node獲取html?

我已經創建了返回文本值(jsoupElement.text())的方法,類似像jsoup文本值方法:

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--

+1

在Java中,您可以使用LSSerializer或使用默認Transformer對子節點或節點本身進行序列化,但是它們會爲您提供DOM樹的XML序列化,而不是原始的XML或HTML。 –

+0

感謝您的回答。是否有可能使用另一個文檔對象模型來獲取原始html?我可以選擇這些模型:http://www.saxonica.com/documentation/index.html#!xpath-api/jaxp-xpath/factory – whitenexx

+1

我不認爲有任何方法可以從任何原始HTML樹模型,它存儲節點而不是標記。我對jsoup不熟悉,但是他們可能也會序列化它們的樹,只有HTML,而不是XML,如果你調用該方法來給你內部的HTML。 Saxon作爲XSLT 2處理器支持使用具有正確輸出方法的XSLT樣式表的HTML和XHTML序列化(即''或'')所以你可以使用帶有樣式表的Transformer根據需要設置方法。也許API也提供了一些方法。 –

回答

0

序列化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樹模型中,因此無法訪問它。