2010-12-10 27 views
28

Tôi đã xem qua mảnh này chức năng Java để chuyển đổi một nút XML để một Java String:XML Node để String trong 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(); 
} 

Có vẻ đơn giản ở chỗ nó muốn chuỗi đầu ra không có bất kỳ Khai báo XML và nó phải chứa thụt đầu dòng.

Nhưng tôi tự hỏi như thế nào sản lượng thực tế nên được, giả sử tôi có một nút 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> 

Tôi có thể đảm nhận Chuỗi kết quả sau khi áp dụng việc chuyển đổi trên là:

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

Tôi muốn để tự mình thử nghiệm, nhưng tôi không có ý tưởng về cách biểu diễn nút XML này theo cách mà hàm này thực sự muốn.

Tôi hơi bối rối và cảm ơn trước sự giúp đỡ hào phóng.

Trả lời

13

Bạn có một sự tôn trọng XML trong cây DOM.
Ví dụ bạn đã mở một tệp XML và bạn đã chuyển nó trong trình phân tích cú pháp DOM.
Kết quả là một cây DOM trong bộ nhớ với XML của bạn được tạo ra.
Bây giờ, bạn chỉ có thể truy cập thông tin XML thông qua traversal của cây DOM.
Nếu bạn cần, một biểu diễn String của thông tin XML của cây DOM mà bạn sử dụng một phép biến đổi.
Điều này xảy ra vì không thể lấy biểu diễn chuỗi trực tiếp từ cây DOM.
Vì vậy, nếu ví dụ như Node node bạn vượt qua trong nodeToString là phần tử gốc của tài liệu XML thì kết quả là một Chuỗi chứa dữ liệu XML gốc.
Thẻ vẫn sẽ ở đó. I E. bạn sẽ có một biểu diễn XML hợp lệ. Chỉ có thời gian này sẽ ở trong một biến String.

Ví dụ:

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

SỰ TỪ BỎ: đã thậm chí không cố gắng để biên dịch mã. Hy vọng rằng bạn hiểu những gì bạn phải làm

31

Tất cả những điều quan trọng đã được nói. Tôi đã cố gắng biên dịch mã sau đây.

 

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(); 
    } 

} 
 

Và nó được sản xuất đầu ra sau đây:

 

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

Bạn có thể tiếp tục tinh chỉnh nó một mình. Chúc may mắn!

+0

Đối với trình đọc thông thường, phiên bản được tinh chỉnh có tại đây: http://stackoverflow.com/a/33936257/363573 – Stephan

Các vấn đề liên quan