2010-12-10 36 views
28

我碰到這一塊的Java功能的來到一個XML節點轉換爲一個Java String表示:XML節點爲String在Java中

private String nodeToString(Node node) { 
StringWriter sw = new StringWriter(); 
try { 
Transformer t = TransformerFactory.newInstance().newTransformer(); 
t.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); 
t.setOutputProperty(OutputKeys.INDENT, "yes"); 
t.transform(new DOMSource(node), new StreamResult(sw)); 
} catch (TransformerException te) { 
System.out.println("nodeToString Transformer Exception"); 
} 
return sw.toString(); 
} 

它看起來簡單,它要輸出字符串沒有任何XML聲明並且它必須包含縮進。

但不知實際產量應該這樣,假設我有一個XML節點:

<p><media type="audio" id="au008093" rights="wbowned"> 
<title>Bee buzz</title> 
</media>Most other kinds of bees live alone instead of in a colony. These bees make 
     tunnels in wood or in the ground. The queen makes her own nest.</p> 

我可以假設將上述改造後得到的字符串:

"media type="audio" id="au008093" rights="wbowned" title Bee buzz title /media" 

我想自己測試它,但我不知道如何用這個函數實際需要的方式表示這個XML節點。

我有點困惑,並提前感謝慷慨的幫助。

回答

13

您在DOM樹中擁有XML respesentation。
例如,您已經打開了一個XML文件,並且已經將它傳遞給了DOM解析器。
因此,創建了一個XML內存中的DOM樹。
現在只能通過遍歷DOM樹來訪問XML信息。
如果您需要,則可以使用變換來表示DOM樹的XML信息的字符串表示形式。
發生這種情況是因爲無法直接從DOM樹中獲取字符串表示。
因此,如果例如Node node您傳入nodeToString是XML文檔的根元素,那麼結果是包含原始XML數據的字符串。
標籤將仍然存在。即您將擁有有效的XML表示。只有這一次會在一個字符串變量。

例如:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder parser = factory.newDocumentBuilder(); 
    Document xmlDoc = parser.parse(file);//file has the xml 
    String xml = nodeToString(xmlDoc.getDocumentElement());//pass in the root 
    //xml has the xml info. E.g no xml declaration. Add it 
    xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?> + xml;//bad to append this way... 
    System.out.println("XML is:"+xml); 

免責聲明:甚至沒有嘗試編譯代碼。希望你明白你要做什麼

31

所有重要的已經說過了。我試圖編譯下面的代碼。

 

import java.io.ByteArrayInputStream; 
import java.io.InputStream; 
import java.io.StringWriter; 

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.transform.OutputKeys; 
import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerException; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.dom.DOMSource; 
import javax.xml.transform.stream.StreamResult; 

import org.w3c.dom.Document; 
import org.w3c.dom.Node; 

public class Test { 

    public static void main(String[] args) throws Exception { 

    String s = 
     "<p>" + 
     " <media type=\"audio\" id=\"au008093\" rights=\"wbowned\">" + 
     " <title>Bee buzz</title>" + 
     " " + 
     " Most other kinds of bees live alone instead of in a colony." + 
     " These bees make tunnels in wood or in the ground." + 
     " The queen makes her own nest." + 
     "</p>"; 
    InputStream is = new ByteArrayInputStream(s.getBytes()); 

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder db = dbf.newDocumentBuilder(); 
    Document d = db.parse(is); 

    Node rootElement = d.getDocumentElement(); 
    System.out.println(nodeToString(rootElement)); 

    } 

    private static String nodeToString(Node node) { 
    StringWriter sw = new StringWriter(); 
    try { 
     Transformer t = TransformerFactory.newInstance().newTransformer(); 
     t.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); 
     t.setOutputProperty(OutputKeys.INDENT, "yes"); 
     t.transform(new DOMSource(node), new StreamResult(sw)); 
    } catch (TransformerException te) { 
     System.out.println("nodeToString Transformer Exception"); 
    } 
    return sw.toString(); 
    } 

} 
 

而且它產生了以下的輸出:

 

<p> <media id="au008093" rights="wbowned" type="audio"> <title>Bee buzz</title> </media> Most other kinds of bees live alone instead of in a colony. These bees make tunnels in wood or in the ground. The queen makes her own nest.</p> 
 

您可以進一步自行調整它。祝你好運!

+0

對於休閒讀者來說,一個調整版本是在這裏:http://stackoverflow.com/a/33936257/363573 – Stephan 2015-11-26 10:48:39