Я пытаюсь использовать JAXB для неМаршалла XML-файлы, схема которых определяется DTD (тьфу!).
Внешний поставщик DTD указал один из атрибутов элемента как xml:lang
:
Это входит в xjc-сгенерированный класс (стандартное поколение; никакое *.xjb волшебство) как:
@XmlAttribute(name = "xml:lang", required = true)
@XmlJavaTypeAdapter(NormalizedStringAdapter.class)
protected String xmlLang;
Однако при немаршалинге допустимых XML-файлов с JAXB, xmlLang
атрибут всегда null
.
Когда я отредактировал XML-файл, заменив xml:lang
с lang
и измененный @XmlAttribute
для соответствия немаршалинг был успешен (т.е. атрибуты были не -null
).
Я действительно находил этот http://old.nabble.com/unmarshalling-ignores-element-attribute-%27xml%27-td22558466.html. Но, разрешение там должно было преобразовать в XML-схему и т.д. Мое решительное предпочтение состоит в том, чтобы пойти прямо от неизменного DTD (так как оно внешне обеспечивается и определяется стандартом ISO).
Действительно ли это - ошибка JAXB? Я пропускаю что-то о "пространствах имен" в названиях атрибута?
FWIW, java -version
= "создайте 1.6.0_20-b02" и xjc -version
= "версия xjc "JAXB 2.1.10 в JDK 6""
Проблема решена путем замены xml:
объявлением пространства имен
в классе, созданном JAXB:
@XmlAttribute(name = "lang", namespace="http://www.w3.org/XML/1998/namespace", required = true)
В некотором смысле это имеет смысл.
Без такого руководства, как JAXB узнает, как интерпретировать неопределенное иначе пространство имен xml:
? Если, конечно, он не реализовал внутреннюю обработку для xml:
, как это сделано в http://java.sun.com/javase/6/docs/api/javax/xml/ stream / XMLStreamReader.html # getNamespaceURI% 28java.lang.String% 29 (см. первое ПРИМЕЧАНИЕ: )
Является ли это ошибкой в генерации xjc
аннотированные объекты или ошибка в unmarhaller, или просто требует отображения где-то в процессе xjc
, все еще остается открытым вопросом в моей голове.
На данный момент он работает, и все, что для этого требуется, - это немного xjc
магии, так что я достаточно счастлив.