Jac*_*ers 7 attributes dtd jaxb unmarshalling
我试图使用JAXB来解组其模式由DTD定义的XML文件(呃!).
DTD的外部提供程序已将其中一个元素属性指定为xml:lang:
<!ATTLIST langSet
id ID #IMPLIED
xml:lang CDATA #REQUIRED
>
Run Code Online (Sandbox Code Playgroud)
这进入了xjc生成的类(标准生成;没有*.xjb魔术):
@XmlAttribute(name = "xml:lang", required = true)
@XmlJavaTypeAdapter(NormalizedStringAdapter.class)
protected String xmlLang;
Run Code Online (Sandbox Code Playgroud)
但是,当使用JAXB解组有效的XML文件时,该xmlLang属性始终是null.
当我编辑XML文件,替换xml:lang用lang,改变了@XmlAttribute相匹配,解组是成功的(即属性是不可null).
我没有找到这个http://old.nabble.com/unmarshalling-ignores-element-attribute-%27xml%27-td22558466.html.但是,解决方案是转换为XML Schema等.我强烈倾向于直接从未改变的DTD(因为它是外部提供并由ISO标准定义).
这是一个JAXB错误吗?我是否遗漏了属性名称中"命名空间"的内容?
FWIW,java -version="build 1.6.0_20-b02"和xjc -version="xjc version"JAXB 2.1.10 in JDK 6""
通过更改用JAXB生成的类中xml:的namespace声明替换来解决了该问题:
@XmlAttribute(name = "lang", namespace="http://www.w3.org/XML/1998/namespace", required = true)
Run Code Online (Sandbox Code Playgroud)
从某种意义上讲,这很有意义。
没有这种指导,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魔力,所以我很高兴。