JAXB Невозможно обработать атрибут с двоеточием (:) в имени? - PullRequest
7 голосов
/ 09 июня 2010

Я пытаюсь использовать JAXB для отмены вызова файлов XML, схема которых определяется DTD (тьфу!).

Внешний поставщик DTD указал один из атрибутов элемента как xml:lang:

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

Это входит в класс, сгенерированный xjc (стандартное поколение; без * .xjb magic) как:

@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 = "build 1.6.0_20-b02" и xjc -version = "версия xjc" JAXB 2.1.10 в JDK 6 ""

Ответы [ 2 ]

5 голосов
/ 10 июня 2010

Решил проблему, заменив xml: заменой объявления namespace в сгенерированном 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 магии, так что я достаточно счастлив.

1 голос
/ 21 июня 2018

Отказ от ответственности: хотя я и опоздал на 8 лет, я добавляю этот ответ для потерянных душ, таких как я, пытаясь понять автоматическую генерацию java-файлов из DTD.

Вы можете настроить проект в целомпространства имен для работы с unmarshaller непосредственно в файле project-info.java с помощью параметра @XmlSchema.

Этот файл должен автоматически генерироваться xjc при генерации классов из схемы, однако он выглядит как xjcне автоматически генерирует файл package-info.java при генерации из DTD!

Однако вы можете вручную создать этот файл и добавить его в тот же пакет, что и файлы, сгенерированные xjc.

Файл будет выглядеть следующим образом:

package-info.java:

@XmlSchema(
    elementFormDefault=XmlNsForm.QUALIFIED, 
    xmlns = {
            @XmlNs(prefix="xlink", namespaceURI="http://www.w3c.org/1999/xlink"),
            @XmlNs(prefix="namespace2", namespaceURI="http://www.w3c.org/1999/namespace2")
    }) 

package your.generated.package.hierarchy;
import javax.xml.bind.annotation.*;

Вы можете добавить столько пространств имен, сколько требуется, простодобавьте новую строку в форме:

@XmlNs(prefix="namespace", namespaceURI="http://www.uri.to.namespace.com")

Преимущество такого подхода по сравнению с редактированием сгенерированного @XmlAttribute состоит в том, что вам не нужно менять каждый генXmlAttribute, и вам не нужно вручную удалять пространства имен из переменной имени XmlAttribute.

...