2012-01-15 97 views
1

如何通過其子節點獲取節點值?例如,我有以下節點解析成DOM Document例如:獲取節點原始文本

<root> 
    <ch1>That is a text with <value name="val1">value contents</value></ch1> 
</root> 

我使用XPath選擇CH1節點。現在我需要得到它的內容,包含<ch1></ch1>之間的所有內容,例如That is a text with <value name="val1">value contents</value>

我該怎麼辦?

回答

0

我發現,使用改造下面的代碼片段,它讓幾乎正是我想要的。可以通過更改輸出方法來調整結果。

public static String serializeDoc(Node doc) { 
     StringWriter outText = new StringWriter(); 
     StreamResult sr = new StreamResult(outText); 
     Properties oprops = new Properties(); 
     oprops.put(OutputKeys.METHOD, "xml"); 
     TransformerFactory tf = TransformerFactory.newInstance(); 
     Transformer t = null; 
     try { 
      t = tf.newTransformer(); 
      t.setOutputProperties(oprops); 
      t.transform(new DOMSource(doc), sr); 
     } catch (Exception e) { 
      System.out.println(e); 
     } 
     return outText.toString(); 
    } 
0

據我所知,在Document中沒有相當於innerHTML。 DOM旨在隱藏您的標記細節。

您可以通過瀏覽該節點的子節點來獲得所需的效果。假設例如要複製文本,但是用編程方式提供的值替換每個「值」標籤:

HashMap<String, String> values = ...; 
StringBuilder str = new StringBuilder(); 
for(Element child = ch1.getFirstChild; child != null; child = child.getNextSibling()) { 
    if(child.getNodeType() == Node.TEXT_NODE) { 
     str.append(child.getTextContent()); 
    } else if(child.getNodeName().equals("value")) { 
     str.append(values.get(child.getAttributes().getNamedItem("name").getTextContent())); 
    } 
} 
String output = str.toString(); 
1

如果這是服務器端的Java(即你不需要擔心其他JVM的運行),您使用的是Sun/Oracle的JDK,你可以做到以下幾點:

import com.sun.org.apache.xml.internal.serialize.OutputFormat; 
import com.sun.org.apache.xml.internal.serialize.XMLSerializer; 

... 

Node n = ...; 
OutputFormat outputFormat = new OutputFormat(); 
outputFormat.setOmitXMLDeclaration(true); 
ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
XMLSerializer ser = new XMLSerializer(baos, outputFormat); 
ser.serialize(n); 
System.out.println(new String(baos.toByteArray())); 

記住,如果解析的xml dom的文本節點的編碼方式不同於您的平臺的默認編碼方式,那麼請記住確保您最終轉換爲字符串時可能需要編碼參數,否則您會在不尋常的字符上發生垃圾。

1

您可以使用jOOX來包裝您的DOM對象並從中獲取許多實用功能,例如您需要的功能。在你的情況,這將產生你需要(使用CSS樣式選擇找到<ch1/>結果:

String xml = $(document).find("ch1").content(); 

或者使用XPath像你一樣:

String xml = $(document).xpath("//ch1").content(); 

內部,jOOX將使用一個變壓器生成該輸出,如其他人所述