2009-05-21 29 views
20

Đây là cách tôi tạo XStream dụ cho XML:Làm thế nào để vô hiệu hóa in ấn khá (không gian trắng/dòng mới) trong XStream?

XStream xstream = new XStream(); 

này là dành cho JSON:

private final XStream xstream = new XStream(new JsonHierarchicalStreamDriver() { 
     public HierarchicalStreamWriter createWriter(Writer writer) { 
      return new JsonWriter(writer, JsonWriter.DROP_ROOT_MODE); 
     } 
    }); 

Cả hai đều khá-in (thụt) đầu ra.

Tôi làm cách nào để yêu cầu XStream tắt tính năng in đẹp?

+0

Cách xác định Writer của riêng mình. Pretty-Print Writer không đáp ứng được nhu cầu của tôi. Tôi muốn dòng mới sau mỗi thuộc tính và phần tử. Làm thế nào sẽ được thực hiện? http://stackoverflow.com/questions/8943000/format-xml-generated-by-xstream – Mady

Trả lời

11

Với một số sự giúp đỡ từ cộng đồng, tôi đã tìm ra câu trả lời.

Đối với XML bạn phải thay đổi cách làm thế nào bạn serialize:

Dòng:

xStream.toXML(o, new OutputStreamWriter(stream, encoding)); 

đổi thành dòng

xStream.marshal(o, new CompactWriter(new OutputStreamWriter(stream, encoding))); 

Đối với JSON bạn chỉ thay đổi cách XStream được tạo ra như thế nào. Vì vậy, việc khởi tạo XStream được đổi thành:

private final XStream xstreamOut = new XStream(new JsonHierarchicalStreamDriver() { 
    public HierarchicalStreamWriter createWriter(Writer writer) { 
     return new JsonWriter(writer, new char[0], "", JsonWriter.DROP_ROOT_MODE); 
    } 
}); 

Lưu ý rằng hàm tạo JsonWriter 4 tham số được sử dụng.

+0

Cách xác định Writer của riêng mình. Pretty-Print Writer không đáp ứng được nhu cầu của tôi. Tôi muốn dòng mới sau mỗi thuộc tính và phần tử. Làm thế nào sẽ được thực hiện? – Mady

+0

Làm cách nào để thêm prolog hoặc stylesheet bằng CompactWriter? Tôi đã sử dụng phương thức write() viết mới để thêm prolog và stylesheets, nhưng CompactWriter không có hàm này. – abi1964

4

Sử dụng phương pháp marschal trên XStream với một nhà văn nhỏ gọn

xstream.marshal(someObject, new CompactWriter(out)); 
+1

Sự khác biệt giữa "marshal" và "toXML" là gì? Đây là những gì tôi sử dụng ngay bây giờ: xStream.toXML (o, OutputStreamWriter mới (luồng, mã hóa)); – IgorM

+1

Dường như CompactWriter chỉ hoạt động cho XML. Tôi đã sửa đổi lệnh của mình thành lệnh sau và giờ tôi luôn nhận được XML, ngay cả khi tôi cần JSON: xStream.marshal (o, CompactWriter mới (new OutputStreamWriter (stream, encoding))); – IgorM

+0

Xem JavaDoc - toXML: Tuần tự hóa một đối tượng thành một chuỗi XML được in đẹp. - marschal: Tuần tự hóa và đối tượng với cấu trúc dữ liệu phân cấp (chẳng hạn như XML). Vì vậy, với marshal bạn nhận được một số tùy chọn đầu ra. Có doenst đường may là một lựa chọn cho JSON. – Mork0075

18

Cảm ơn, bài đăng của bạn đã giúp !!! Đây là những gì tôi sử dụng để chuyển đổi thành một chuỗi.

String strXML = ""; 
XStream xs = new XStream(); 
StringWriter sw = new StringWriter(); 
xs.marshal(this, new CompactWriter(sw)); 
strXML = sw.toString(); 
1

Hành vi mặc định của khá-in xuất phát từ phương pháp AbstractXmlDriver.createWriter() (XStream sử dụng XppDriver như lái xe dòng thứ bậc mặc định của nó và điều này kéo dài AbstractXmlDriver):

public HierarchicalStreamWriter createWriter(Writer out) { 
    return new PrettyPrintWriter(out, getNameCoder()); 
} 

Nếu bạn muốn vô hiệu hóa việc in ấn trên toàn cầu (trong khi giữ lại tất cả các hành vi mặc định khác) và chỉ sử dụng phương thức toXML (o) đơn giản hơn là sử dụng các tùy chọn khác được đề xuất ở đây, bạn có thể khởi tạo cá thể XStream của bạn như sau. Điều này ghi đè phương pháp trên bằng CompactWriter.

XStream xstream = new XStream(new XppDriver() { 
    @Override 
    public HierarchicalStreamWriter createWriter(Writer out) { 
     return new CompactWriter(out, getNameCoder()); 
    } 
}); 
Các vấn đề liên quan