2012-03-16 74 views
3

我必須處理大型XML文檔,這些文檔通常會錯誤地處理缺少的屬性數據。而不是僅僅遺漏缺少數據的屬性,該屬性用空字符串值指定。這會導致解組時出現問題,因爲空字符串的一個值。使用JAXB將空字符串解組爲空的正確方法

例如,應該是什麼

<SOME_ELEMENT attr1="someValue"/> 

反而

<SOME_ELEMENT attr1="someValue" attr2="" attr3=""/> 

我試圖拿出適當地處理這個不好的XML的「正確」的方式。我們的目標是將屬性的值視爲空白字符串時省略,而空白字符串永遠不會是該屬性的有效值(例如整數)。

我目前使用XMLAdapters將這些空字符串轉換爲空(如建議in this post),但這似乎是錯誤的解決方案。我正在使用的文檔中的許多屬性已經使用了從其他代碼共享的類型適配器,並且似乎沒有爲屬性指定多個XMLAdapter的方法。

有沒有一種標準的方法來處理我剛剛錯過的這種類型的情況?

謝謝!

編輯

我在尋找,不需要我來編輯每個不同的JAXB的解決方案映射類,因爲有幾十個都具有相同的需求。理想情況下,這個問題的解決方案將允許我爲所有屬性指定一個通用策略,並根據需要允許特定的覆蓋。

+0

你想要什麼樣的行爲?你想要綁定的欄值爲零或空或空字符串,或其他完全? – 2012-04-10 14:37:22

+0

還有什麼問題http://stackoverflow.com/questions/5133250/jaxb-how-to-make-jaxb-not-to-unmarshal-empty-string-to-0?這是一個語義問題,而不是xml語法問題。 xml實際上是格式良好的。我這樣說是因爲這意味着它不會是一個優雅的技術解決方案,因爲它是一個業務邏輯問題。 – 2012-04-10 14:40:32

+0

的行爲應該是將關聯的JAXB映射類中「bar」的值設置爲null,這將視爲該屬性被省略。海事組織,業務邏輯是不同的事情。我期望處理生成的JAXB對象樹的代碼負責業務邏輯(例如,如果省略了特定值,則拒絕XML文檔)。我在尋找的是一種全面的方式來處理所有空屬性值,其中空值永遠不會有效,就好像它們被省略一樣。也許這種行爲應該被視爲商業邏輯? – Terence 2012-04-10 19:24:00

回答

0

我認爲模式要遵循的模式是,在這個帖子: Customizing error handling of JAXB unmarshall process

與元素,XML可以指定它爲空(如下)。對於字符串類型,空元素和屬性(有時缺少元素)可以被解釋爲空字符串。因此,您必須將您的邏輯視爲業務邏輯,這是使用afterUnmarshal事件處理的。

<foo xsi:nil="true" /> 
+0

不幸的是,這個例子是基於元素的,而不是基於屬性的(我的問題是關於屬性的)。此外,post中建議的afterUnmarshal方法不允許我確定是否從空字符串或合法值(例如,值爲1的整數)解析了非字符串值。 – Terence 2012-04-09 14:46:38

+0

我的一個觀點是,只有xml元素可以爲null,但這對你沒有幫助。你能更具體地瞭解你的情況嗎?元素是什麼,屬性是什麼? – 2012-04-09 23:37:03

+0

我在那裏有點不清楚,對此感到遺憾。我已經更新了描述 – Terence 2012-04-10 06:39:49

相關問題