2012-02-17 3 views
20

Wygląda na to, że XStream (com.thoughtworks.xstream -> xstream 1.4.2) obsługuje znaki podkreślenia w nazwach elementów i atrybutów w bardzo dziwny sposób. Muszę pobrać i przeanalizować xml od klienta, który ma podkreślenia w swoich atrybutach. To jest moja pierwsza próba z XStreamem i jestem trochę rozczarowany, ponieważ miałem nadzieję, że uniknę tego brzydkiego parsowania xml.XStream i podkreślenia

Tutaj przedstawiam małą próbkę do sprawdzenia zachowania. Ostatni przykład pokazuje mój problem.

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

ten wyprowadza

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

Teraz moje pytanie - czy jest jakiś sposób, aby XStream zrozumieć pojedyncze podkreślenia?

Odpowiedz

12

XStream używa znaku podkreślenia, aby uniknąć znaków w identyfikatorach ważnych w Javie, ale jest nieprawidłowy w XML (patrz here). Zatem samo podkreślenie musi zostać usunięte. Możesz użyć niestandardowego NameCoder zgodnie z opisem w FAQ.

Powiedziawszy, że normalnie mogę dogadać się z NoNameCoder. Ale: jeśli to możliwe, nie używaj podkreśleń w identyfikatorach właściwości Java. jest nietypowy dla Javy i przeciwko Java Naming Conventions.

+0

Dzięki bardzo. XStream (nowy StaxDriver (nowy NoNameCoder())) nie działał, więc zbadam, jak zrobić niestandardowy. – eigil

+0

NoNameCoder działa. Właśnie zapomniałem dodać @XStreamAlias ​​("a_b") do zmiennej, kiedy zmieniłem ją na ab na podstawie twojej sugestii o konwencjach nazewnictwa java. – eigil

18

Ten pracował dla mnie:

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

XmlFriendlyReplacer() działa tak samo. – kitokid

+0

Pracowałem dla mnie. XmlFriendlyReplacer() jest zdyskredytowany. –

+0

Awesome. Pracował świetnie. –

3

użyłem:

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

i to działało świetnie! Używam x-stream wersji 1.4.5. Mam nadzieję, że to pomoże!

2

pracował dla mnie:

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

działa na 1.4.7 tylko z '" UTF8 "' zamiast '" UTF_8 "' – Vertex