2012-02-17 41 views
20

Dường như XStream (com.thought-.xstream -> xstream 1.4.2) đang xử lý dấu gạch dưới trong tên phần tử và thuộc tính theo cách rất lạ. Tôi cần tìm nạp và phân tích cú pháp xml từ khách hàng có dấu gạch dưới trong thuộc tính của họ. Đây là lần thử đầu tiên của tôi với XStream và tôi hơi thất vọng vì tôi đã hy vọng tránh được tất cả các phân tích cú pháp xml xấu xí.XStream và gạch dưới

Ở đây tôi cung cấp một mẫu thử nhỏ để làm sáng hành vi. Ví dụ cuối cùng cho thấy vấn đề của tôi.

public class MyTest { 
    public void testIt() { 
    C1 a = new C1(); 
    a.a_b= "a_b"; 

    XStream xstream = new XStream(); 
    xstream.processAnnotations(C1.class); 

    String xml = xstream.toXML(a); 
    Logger.info(xml); 

    C1 b = (C1) xstream.fromXML(xml); 
    Logger.info(b.a_b); 

    C1 c = (C1) xstream.fromXML("<C1 a_b=\"a_b\"/>"); 
    Logger.info(c.a_b); 
    } 
} 

@XStreamAlias("C1") 
class C1 { 
@XStreamAsAttribute 
String a_b; 
} 

này kết quả đầu ra

INFO: <C1 a__b="a_b"/> 
INFO: a_b 
INFO: null 

Bây giờ câu hỏi của tôi - là có một cách để làm cho XStream hiểu một dấu gạch dưới không?

Trả lời

12

XStream sử dụng dấu gạch dưới để thoát khỏi các ký tự trong số nhận dạng hợp lệ trong Java nhưng không hợp lệ trong XML (xem here). Vì vậy, gạch dưới chính nó đã được thoát. Bạn có thể sử dụng tùy chỉnh NameCoder như được mô tả trong Câu hỏi thường gặp.

Điều đó nói rằng tôi thường có thể hòa hợp với số NoNameCoder. Nhưng: Không sử dụng dấu gạch dưới trong số nhận dạng thuộc tính Java, nếu có thể; nó không điển hình đối với Java và chống lại số Java Naming Conventions.

+0

Cảm ơn rất nhiều. XStream (new StaxDriver (new NoNameCoder())) không hoạt động nên tôi sẽ điều tra việc tạo một custom. – eigil

+0

NoNameCoder không hoạt động. Tôi chỉ quên thêm @XStreamAlias ​​("a_b") vào biến khi tôi thay đổi nó thành ab dựa trên đề xuất của bạn về các quy ước đặt tên java. – eigil

18

này đã làm việc cho tôi:

XStream xs = new XStream(new DomDriver("UTF-8", new XmlFriendlyNameCoder("_-", "_"))); 
+0

XmlFriendlyReplacer() cũng hoạt động tương tự. – kitokid

+0

Làm việc cho tôi. XmlFriendlyReplacer() được depricated. –

+0

Tuyệt vời. Làm việc tuyệt vời. –

3

tôi đã sử dụng:

XmlFriendlyNameCoder nameCoder = new XmlFriendlyNameCoder("ddd", "_"); 
XStream xmlStream = new XStream(new Dom4JDriver(nameCoder)); 

và nó làm việc tuyệt vời! Tôi đang sử dụng phiên bản x-stream 1.4.5. Hy vọng điều đó sẽ hữu ích!

2

Làm việc cho tôi:

XStream xstream = new XStream(new DomDriver("UTF_8", new NoNameCoder())); 
+0

hoạt động trên 1.4.7 chỉ với '" UTF8 "' thay vì '" UTF_8 "' – Vertex

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