2014-08-29 63 views
1

所以我搜索了很多關於這個特定問題的解決方案,我希望有人能指出我的方向。缺少名稱空間定義的JAXB問題

我們以XML格式接收數據,而我們只有XSD來驗證數據。所以我使用JAXB來生成Java類。當我去解組示例XML時,發現缺少一些屬性值。事實證明,模式期望這些屬性是QName,但是數據提供者沒有在XML中定義前綴。

例如,一個XML屬性值爲"repository:<uuid>",但名稱空間前綴「存儲庫」從未在數據集中定義。 (不要介意提供商的最佳做法建議定義它!)

所以,當我去解組樣本集,具有指定前綴(在我上面的示例中的「儲存庫」)的QName屬性是NULL!所以它看起來像JAXB是「拋出」那些具有未定義名稱空間前綴的屬性QName值。我很驚訝,它甚至不保留本地名稱。

理想情況下,我想保持原樣,但看起來我無法在綁定時將QName映射到字符串(從Schema到Java)。

我嘗試了「手動」將名稱空間定義插入到XML中,它的工作方式就像一個魅力。這樣做最簡單的方法是什麼?

有沒有辦法在運行時「插入」命名空間映射/定義?或者在綁定時「全局」定義它?

+1

我強烈建議您發佈CSD和XML文檔的相關部分。您接收的XML仍然很可能與XSD不一致,而這對於JAXB的非編組將會是一個問題。如果您已經確定XML實際上符合XSD(例如使用在線驗證工具),請說出來(以便SO助手避開它)。 – 2014-08-29 02:53:48

+0

我想知道我是否應該提供一些更多的細節,但在我的平板電腦上有點困難。下次我會提供代碼的實際出價。感謝您的反饋。 – raydogg 2014-08-29 21:55:39

回答

2

最簡單的方法是使用字符串代替QName。您可以使用javaType定製to achieve this

如果你想在運行時添加前綴/命名空間映射,也有相當多的方式來做到這一點:

  • 與上述類似,你可以提供自己的QName轉換器,它會考慮你的前綴。
  • 您可以在其中放置SAX或StAX過濾器,並在startDocument中聲明其他前綴。
  • 實際需要的是將您的前綴映射添加到UnmarshallingContext.environmentNamespaceContext。我檢查了源代碼,但找不到一個直接和簡單的方法來做到這一點。

我個人會實現一個SAX/StAX過濾器來在事件級別「預處理」你的XML。

+0

我採納了你的建議,它的工作原理。我基本上實現了自己的XMLStreamReader並評估了特定字符串的響應。這限制了靈活性,但我希望日期提供商最終能夠儘快解決這個特定問題。 – raydogg 2014-08-29 21:53:21

相關問題