2012-02-17 14 views
20

ऐसा लगता है कि एक्सस्ट्रीम (com.thoughtworks.xstream -> xstream 1.4.2) तत्व में अंडरस्कोर को संभालने और नामों को बहुत अजीब तरीके से प्रबंधित कर रहा है। मुझे अपने गुणों में अंडरस्कोर वाले ग्राहक से एक्सएमएल लाने और पार्स करने की आवश्यकता है। एक्सस्ट्रीम के साथ यह मेरी पहली कोशिश है और मैं थोड़ा निराश हूं क्योंकि मैं सभी बदसूरत एक्सएमएल पार्सिंग से बचने की उम्मीद कर रहा था।एक्सस्ट्रीम और अंडरस्कोर

यहां मैं व्यवहार को हाइलाइट करने के लिए एक छोटा परीक्षण नमूना प्रदान करता हूं। आखिरी उदाहरण मेरी समस्या दिखाता है।

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

यह

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

आउटपुट अब मेरे सवाल - वहाँ Xstream एक भी अंडरस्कोर समझ में बनाने के लिए एक तरीका है?

उत्तर

12

एक्सस्ट्रीम जावा में मान्य पहचानकर्ताओं में वर्णों से बचने के लिए अंडरस्कोर का उपयोग करता है लेकिन एक्सएमएल में अमान्य (here देखें)। तो अंडरस्कोर खुद से बच जाना है। आप एफएक्यू में वर्णित कस्टम NameCoder का उपयोग कर सकते हैं।

मैंने कहा कि मैं आमतौर पर NoNameCoder के साथ मिल सकता हूं। लेकिन: यदि संभव हो तो जावा प्रॉपर्टी पहचानकर्ताओं में अंडरस्कोर का उपयोग न करें; यह जावा के लिए और Java Naming Conventions के खिलाफ अनियमित है।

+0

धन्यवाद बहुत बहुत। एक्सस्ट्रीम (नया स्टैक्सड्राइवर (नया नोनामकोडर())) काम नहीं किया है इसलिए मैं एक कस्टम बनाने की जांच करूंगा। – eigil

+0

NoNameCoder काम करता है। जब मैं जावा नामकरण सम्मेलनों के बारे में आपके सुझाव के आधार पर इसे बदलता हूं तो मैं बस @XStreamAlias ​​("a_b") को चर में जोड़ना भूल गया था। – eigil

18

यह मेरे लिए काम किया:

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

XmlFriendlyReplacer() भी वही काम करता है। – kitokid

+0

मेरे लिए काम किया। XmlFriendlyReplacer() को हटा दिया गया है। –

+0

बहुत बढ़िया। महान काम किया। –

3

मैं प्रयोग किया है:

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

और यह बहुत अच्छा काम किया है! मैं एक्स-स्ट्रीम संस्करण 1.4.5 का उपयोग कर रहा हूं। उम्मीद है कि यह मदद करता है!

2

मेरे लिए काम किया:

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

'UTF_8" के बजाय केवल "यूटीएफ 8" के साथ 1.4.7 पर काम करता है। – Vertex

संबंधित मुद्दे