2010-06-09 13 views
6

Ich versuche mit JAXB eine XML-Datei zu entpacken, deren Schema durch eine DTD (ugh!) Definiert ist.JAXB Attribut nicht mit Colon (:) im Namen umgehen?

Der externe Anbieter der DTD eines des Elements angegeben hat Attribute als xml:lang:

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

Diese in die xjc generierten kommt Klasse (Standard Generation, keine * .xjb Magie) als:

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

wenn jedoch gültige XML-Dateien mit JAXB unmarshalling ist das xmlLang Attribut immer null.

Wenn ich die XML-Datei bearbeitet, ersetzt xml:lang mit lang und verändert die @XmlAttribute übereinstimmen, unmarshalling erfolgreich war (das heißt nicht-Attribute null waren).

Ich habe diese http://old.nabble.com/unmarshalling-ignores-element-attribute-%27xml%27-td22558466.html gefunden. Aber die Auflösung, die es gab, war es, in XML-Schema usw. zu konvertieren. Meine starke Präferenz besteht darin, direkt von einer unveränderten DTD zu gehen (da sie extern bereitgestellt und durch einen ISO-Standard definiert ist).

Ist das ein JAXB-Fehler? Fehle ich etwas über "Namespaces" in Attributnamen?

FWIW, java -version = "bauen 1.6.0_20-b02" und xjc -version = "xjc Version "JAXB 2.1.10 in JDK 6""

+0

Welche DTD ist das? 'xml: lang' ist ein Meta-Attribut für ein XML-Schema, also beschreibt die DTD etwas, das von einem Schema stammt, was mir nahelegt, dass es ein vollständiges Schema gibt. – skaffman

+0

AFAIK, der Herausgeber stellt nur eine DTD zur Verfügung. Es wäre schwer vorstellbar, dass sie eine DTD veröffentlichen, die auf einem Schema basiert, aber Letzteres nicht verfügbar macht. Ich habe jedoch den Autor einiger verwandter Werkzeuge fragen lassen, ob ich ein Schema verwende, um die JAXB-Objekte zu erzeugen, also könnte etwas da draußen sein ... –

+0

Danke für den Nabble-Link. Du hast mir das Leben leichter gemacht. – chaostheory

Antwort

4

das Problem wurde gelöst durch xml: mit einer namespace Erklärung ersetzt in der JAXB Wechsel -generierte Klasse:

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

Das macht Sinn, in gewisser Weise.

Ohne diese Anleitung, wie würde JAXB wissen, wie man den ansonsten undefinierten Namensraum xml: interpretiert? Es sei denn natürlich, es einige Spezialfälle interne Handhabung xml: implementiert, wie in http://java.sun.com/javase/6/docs/api/javax/xml/stream/XMLStreamReader.html#getNamespaceURI%28java.lang.String%29 (siehe den ersten HINWEIS:) getan

Ob es ein Fehler in xjc ‚s Generation der kommentierten Objekte ist oder ein Fehler in der unmarhaller, oder erfordert einfach eine Zuordnung irgendwo in der xjc Prozess ist immer noch eine offene Frage in meinem Kopf.

Für jetzt funktioniert es und alles, was es erfordert, ist ein wenig xjc Magie, also bin ich einigermaßen glücklich.