2012-02-17 16 views
20

Parece que XStream (com.thoughtworks.xstream -> xstream 1.4.2) maneja los guiones bajos en los nombres de elementos y atributos de una manera muy extraña. Necesito buscar y analizar un xml de un cliente que tenga caracteres de subrayado en sus atributos. Este es mi primer intento con XStream y estoy un poco decepcionado ya que esperaba evitar todo el feo análisis xml.XStream y caracteres de subrayado

Aquí proporciono una pequeña muestra de prueba para ilustrar el comportamiento. El último ejemplo muestra mi problema.

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

Esto da salida a

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

Ahora mi pregunta - ¿hay una manera de hacer entender xstream un solo guión?

Respuesta

12

XStream utiliza el guion bajo para escapar caracteres en identificadores que son válidos en Java pero inválidos en XML (ver here). Entonces el guión bajo tiene que ser escapado. Puede usar un NameCoder personalizado como se describe en las Preguntas frecuentes.

Dicho esto, normalmente me llevo bien con NoNameCoder. Pero: no use guiones bajos en los identificadores de propiedad de Java, si es posible; es atípico para Java y contra el Java Naming Conventions.

+0

Muchas gracias. XStream (nuevo StaxDriver (nuevo NoNameCoder())) no funcionó, así que investigaré creando uno personalizado. – eigil

+0

NoNameCoder funciona. Me olvidé de agregar @XStreamAlias ​​("a_b") a la variable cuando la cambié a ab en función de su sugerencia acerca de las convenciones de nomenclatura de Java. – eigil

18

Esto funcionó para mí:

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

XmlFriendlyReplacer() funciona igual también. – kitokid

+0

Funcionó para mí. XmlFriendlyReplacer() está privado. –

+0

Impresionante. Funcionó muy bien. –

3

utilicé:

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

y funcionó muy bien! Estoy usando x-stream versión 1.4.5. Espero que ayude!

2

trabajado para mí:

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

funciona en 1.4.7 solo con '" UTF8 "' en lugar de '" UTF_8 "' – Vertex

Cuestiones relacionadas