2010-06-09 173 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魔法,所以我相當高興。

相關問題