2008-11-24 17 views
61

Đây là mã hiện đang được sử dụng.Có cách nào thanh lịch hơn để chuyển đổi một tài liệu XML thành một chuỗi trong Java so với mã này không?

public String getStringFromDoc(org.w3c.dom.Document doc) { 
     try 
     { 
      DOMSource domSource = new DOMSource(doc); 
      StringWriter writer = new StringWriter(); 
      StreamResult result = new StreamResult(writer); 
      TransformerFactory tf = TransformerFactory.newInstance(); 
      Transformer transformer = tf.newTransformer(); 
      transformer.transform(domSource, result); 
      writer.flush(); 
      return writer.toString(); 
     } 
     catch(TransformerException ex) 
     { 
      ex.printStackTrace(); 
      return null; 
     } 
    } 

Trả lời

77

Dựa trên DOM Level3 Load/Save:

public String getStringFromDoc(org.w3c.dom.Document doc) { 
    DOMImplementationLS domImplementation = (DOMImplementationLS) doc.getImplementation(); 
    LSSerializer lsSerializer = domImplementation.createLSSerializer(); 
    return lsSerializer.writeToString(doc); 
} 
+2

Có Java 7 cung cấp một giải pháp thay thế khác không? –

+0

nhập khẩu org.w3c.dom.ls.DOMImplementationLS; nhập org.w3c.dom.ls.LSSerializer; –

12

API biến áp là cách chuẩn XML duy nhất để chuyển từ đối tượng DOM sang dạng tuần tự hóa (Chuỗi trong trường hợp này). Theo tiêu chuẩn, tôi có nghĩa là SUN Java XML API for XML Processing.

Các lựa chọn thay thế khác như Xerces XMLSerializer hoặc JDOM XMLOutputter là các phương pháp trực tiếp hơn (ít mã hơn) nhưng chúng đặc thù cho khung công tác.

Theo ý kiến ​​của tôi, cách bạn đã sử dụng là thanh lịch và di động nhất của tất cả. Bằng cách sử dụng một API Java chuẩn XML, bạn có thể cắm Trình phân tích cú pháp XML hoặc Trình biến đổi XML mà bạn chọn mà không thay đổi mã (giống như các trình điều khiển JDBC). Có điều gì tao nhã hơn thế không?

13

Đây là ngắn gọn hơn một chút:

try { 
    Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
    StreamResult result = new StreamResult(new StringWriter()); 
    DOMSource source = new DOMSource(doc); 
    transformer.transform(source, result); 
    return result.getWriter().toString(); 
} catch(TransformerException ex) { 
    ex.printStackTrace(); 
    return null; 
} 

Nếu không, bạn có thể sử dụng một thư viện như XMLSerializer từ Apache:

//Serialize DOM 
OutputFormat format = new OutputFormat (doc); 
// as a String 
StringWriter stringOut = new StringWriter();  
XMLSerializer serial = new XMLSerializer (stringOut,format); 
serial.serialize(doc); 
// Display the XML 
System.out.println(stringOut.toString()); 
+0

Tôi thích biến thể thứ hai. Với JRE 1.8.0 'XMLSerializer' thậm chí là một phần của' rt.jar' –

8

Bạn có thể sử dụng XOM tới có lẽ làm điều này:

org.w3c.dom.Document domDocument = ...; 
nu.xom.Document xomDocument = 
    nu.xom.converters.DOMConverter.convert(domDocument); 
String xml = xomDocument.toXML(); 
+1

+1, XOM (và các thư viện tương tự khác) có thể thực sự đơn giản hóa vấn đề. – Jonik

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