2010-06-09 174 views
6

我正在尝试使用JAXB解组一个由DTD定义架构的XML文件(唉!)。JAXB无法处理名称中包含冒号(:)的属性?

的DTD的外部提供商指定的元件的一个属性作为xml:lang

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

这来自入XJC生成的类(标准产生;无* .xjb魔法)为:

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

但是,当使用JAXB解组有效的XML文件时,xmlLang属性始终为null

当我编辑的XML文件,替换xml:langlang并改变了@XmlAttribute匹配,解组是成功的(即属性是非null)。

我的确发现了这个http://old.nabble.com/unmarshalling-ignores-element-attribute-%27xml%27-td22558466.html。但是,解决方案需要转换为XML Schema等。我强烈的偏好是直接从未经过修改的DTD(因为它由ISO标准外部提供和定义)。

这是一个JAXB错误?我是否在属性名称中缺少有关“名称空间”的内容?

FWIW,java -version = “建立1.6.0_20-B02” 和xjc -version = “XJC版本 ”JAXB 2.1.10在JDK 6“”

+0

这是哪个DTD? 'xml:lang'是一个XML Schema元属性,所以DTD描述了一个源于Schema的东西,这会告诉我这里有一个完整的模式。 – skaffman 2010-06-09 20:18:07

+0

AFAIK,发行商只提供DTD。很难想象它们会基于Schema发布DTD,但不要使后者可用。然而,我有一些相关工具的作者询问我是否使用Schema生成JAXB对象,所以可能有些东西在那里...... – 2010-06-10 12:36:09

+0

感谢您的讨论链接。你让我的生活更轻松。 – chaostheory 2011-04-29 22:07:22

回答

4

解决该问题通过改变与在JAXB一个namespace声明替换xml: - 生成的类:

@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的代标注对象的或错误的一个bug unmarhaller,或者仅仅需要映射到某个地方的过程,在我看来仍然是一个悬而未决的问题。

现在,它的工作,它只需要一点点xjc魔法,所以我相当高兴。

相关问题