2010-06-09 30 views
6

Estoy intentando usar JAXB para separar los archivos XML cuyo esquema está definido por una DTD (ugh!).JAXB No se puede manejar el atributo con dos puntos (:) en el nombre?

El proveedor externo de la DTD ha especificado uno de los atributos de elementos como xml:lang:

<!ATTLIST langSet 
id ID #IMPLIED 
xml:lang CDATA #REQUIRED 
> 

Esto entra en la clase generada xjc-(generación estándar, sin la magia * .xjb) como:

@XmlAttribute(name = "xml:lang", required = true) 
@XmlJavaTypeAdapter(NormalizedStringAdapter.class) 
protected String xmlLang; 

Sin embargo, al desmarcar archivos XML válidos con JAXB, el atributo xmlLang es siempre null.

Cuando edité el archivo XML, en sustitución de xml:lang con lang y cambió el @XmlAttribute a la altura, unmarshalling tuvo éxito (es decir, atributos eran no null).

Encontré esto http://old.nabble.com/unmarshalling-ignores-element-attribute-%27xml%27-td22558466.html. Pero, la resolución era convertir a XML Schema, etc. Mi fuerte preferencia es ir directamente desde una DTD no modificada (dado que está provista externamente y definida por un estándar ISO).

¿Es esto un error JAXB? ¿Me falta algo sobre "espacios de nombres" en los nombres de atributos?

Fwiw, java -version = "construir 1.6.0_20-b02" y xjc -version = "xjc versión "JAXB 2.1.10 en JDK 6""

+0

¿Qué DTD es esto? 'xml: lang' es un meta-atributo de esquema XML, por lo que la DTD está describiendo algo que se originó a partir de un esquema, lo que me sugeriría que hay un esquema completo. – skaffman

+0

AFAIK, el editor solo pone a disposición una DTD. Sería difícil imaginar que publican una DTD basada en un esquema, pero no la ponen a disposición. Sin embargo, el autor de algunas herramientas relacionadas me ha preguntado si estoy usando un esquema para generar los objetos JAXB, por lo que podría haber algo por ahí ... –

+0

Gracias por el enlace de Nabble. Hiciste mi vida más fácil. – chaostheory

Respuesta

4

resuelto el problema cambiando la sustitución de xml: con una declaración namespace en el JAXB -generated class:

@XmlAttribute(name = "lang", namespace="http://www.w3.org/XML/1998/namespace", required = true) 

Lo que tiene sentido, en cierto modo.

Sin este tipo de guía, ¿cómo sabría JAXB cómo interpretar el espacio de nombre indefinido xml:? A menos que, por supuesto, se implementó un manejo interno caso especial de xml: como se hace en http://java.sun.com/javase/6/docs/api/javax/xml/stream/XMLStreamReader.html#getNamespaceURI%28java.lang.String%29 (ver la primera NOTA:)

Ya se trate de un error en xjc 's generación de los objetos anotados o un error en el unmarhaller, o simplemente requiere un mapeo en algún lugar del proceso xjc, sigue siendo una pregunta abierta en mi mente.

Por ahora, está funcionando y todo lo que necesita es un poco de magia xjc, así que estoy razonablemente feliz.

Cuestiones relacionadas