2009-10-28 3 views
13

đọc tài liệu cho java org.w3c.dom.ls có vẻ như một phần tử chỉ có thể được tuần tự hóa thành một chuỗi có mã hóa chuỗi gốc java, UTF-16. Tôi cần tuy nhiên để tạo ra một chuỗi UTF-8, trốn thoát hoặc những gì không, tôi hiểu rằng nó vẫn sẽ là một chuỗi UTF-16. Bất cứ ai có một ý tưởng để có được xung quanh này? Tôi cần chuỗi để chuyển sang ứng dụng khách WS được tạo sẽ sử dụng Chuỗi, sau đó nó phải là UTF-8.Thực hiện chuỗi tuần tự hóa DOM thành chuỗi trong UTF-8 trong Java

mã tôi sử dụng để tạo ra các chuỗi:

DOMImplementationRegistry domImplementationRegistry = DOMImplementationRegistry. 
DOMImplementationLS domImplementationLS = (DOMImplementationLS) REGISTRY.getDOMImplementation("LS"); 
LSSerializer writer = domImplementationLS.createLSSerializer(); 
String result = writer.writeToString(element); 
+1

@Tomas - không có những điều như một UTF-8 Java String. Tôi mong đợi bất kỳ nỗ lực nào để ép buộc các byte được mã hóa UTF-8 thành một loại char để kết thúc trong nước mắt. – McDowell

Trả lời

7

tôi thấy rằng cách linh hoạt nhất của serializing một DOM để String là sử dụng javax.xml.transform API:

Node node = ... 
    StringWriter output = new StringWriter(); 

    Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
    transformer.transform(new DOMSource(node), new StreamResult(output)); 

    String xml = output.toString(); 

Nó không phải đặc biệt thanh lịch, nhưng nó sẽ giúp bạn kiểm soát tốt hơn mã hóa đầu ra.

+0

hoạt động như một sự quyến rũ, nhưng làm cách nào để đặt mã hóa rõ ràng, điều này tạo ra UTF-8 không có cấu hình? – Tomas

+0

Tùy thuộc vào việc thực hiện 'Writer' mà bạn sử dụng. 'StringWriter' chỉ xảy ra mặc định là UTF-8, tôi nghĩ vậy. – skaffman

+1

@skaffman - "StringWriter chỉ xảy ra mặc định là UTF-8". Bạn nhầm rồi. Chuỗi là UTF-16; biến áp có thể thêm một tiêu đề XML có nội dung '', nhưng điều đó không liên quan gì đến bất kỳ hoạt động mã hóa thực tế nào. – McDowell

13

Bạn vẫn có thể sử dụng DOMImplementationLS:

DOMImplementationRegistry domImplementationRegistry = DOMImplementationRegistry. 
DOMImplementationLS domImplementationLS = (DOMImplementationLS)REGISTRY.getDOMImplementation("LS"); 
LSOutput lsOutput = domImplementationLS.createLSOutput(); 
lsOutput.setEncoding("UTF-8"); 
Writer stringWriter = new StringWriter(); 
lsOutput.setCharacterStream(stringWriter); 
lsSerializer.write(doc, lsOutput);  
String result = stringWriter.toString();