我在Java中的複雜模型對象圖需要被翻譯來回轉換爲XML文檔。 XML文檔模式的對象圖結構與模型的對象樹極其不同。這兩者是可以互換的,但翻譯需要大量使用父母/子女關係的情境驅動邏輯。
的問題
我與已經很好地建立在舊系統和XML文檔的架構是相當新的模型對象的工作。由於我們的許多代碼依賴於模型對象的結構,我們不想重構它們。下面是結構上的差異我處理的類型的一個簡化的例子:
實施例的數據模型樹
項目
- 說明
- 成本
- .. 。
人
- 名
- 姓
- 地址
- ...
地址
- 街
- 市
- ...
SaleTransaction(*這是被翻譯的東西)
- 買家(人)
- 賣家(人)
- 已售項目[](列表)
- 交換的項目[] (列表)
- 交易地點(地址)
實施例的XML文檔結構
交換
- 類型
- 締約方
- party_contact_ref
- 類型
- CONTACT_ID
- 交易詳情
- 型
- total_amount_exchanged
- 項目
- 項目
- 型
- owning_party_contact_ref_id
個- exchange_use_type
- 聯繫
- 聯繫
- ID
- 型
兌換類型:[現金出售| BARTER |組合現金和巴特爾]
聯繫類型:[PERSON | ADDRESS]
更改詳情類型:[現金交易| BARTER EXCHANGE]
SaleTransaction和Exchange之間的映射是可能的,只是不是1-1。在該示例中,模型中的「買家」將被映射到XML文檔中的聯繫人和聯繫人引用元素。此外,「Item」元素的「owning_party_contact_ref_id」屬性的值將通過查看SaleTransaction對象圖中的幾個不同值來確定。
如果我正在使用的對象圖需要一些翻譯以便在XML文檔中使用,那麼我的轉向工具是一個XmlAdapter。但在這種情況下,我沒有看到使用JAXB XML適配器作爲可行的解決方案,原因有三。
- 模型圖中對象中的哪個XML元素也與數據相關。我相信所有的XmlAdapter類/屬性映射都是固定的。
- 似乎無法與XmlAdapters進行多對一或多對一的解決方案。 MOXy有一個interesting extension,但同樣需要固定映射到屬性。
- 據我所知,XmlAdapters可以處理單個對象,並且沒有辦法獲取整編/解組圖的整個圖的上下文。
問題
我敢肯定,這類型的問題是相當普遍的,所以你怎麼處理呢?有沒有辦法用標準工具來處理這個問題?
我想出
在情況下,它很有趣,這裏是我想出來的各種可能的方法:
#1 獨立對象圖轉換問題來自XML生成問題。我有一個本土工具,可以幫助您根據某些上下文對象生成對象圖。我可以從XML模式創建JAXB類,然後依靠此工具根據模型對象的上下文生成這些類的對象。這可以很好地從模型對象圖生成一個XML文檔,但不是相反。這也意味着依賴非標準工具,如果可能的話,我想盡量避免使用這些工具。
#2 轉到XmlAdapter瘋狂和修改模型類能夠保留轉換狀態的信息(例如使用該對象模型樹創建XML文檔中該元素)。這將使問題與JAXB的標準使用模型非常接近,但我認爲這將是開發,測試和維護的噩夢。
#3 像我在#1中分開對象圖問題,但使用JDOM而不是JAXB。這將刪除所有JAXB所需的類和映射,但需要構建另一個定製工具來管理模型對象到DOM樹的映射。
我對這三種解決方案中的任何一種都不感興趣,但我最偏愛#1。
您可能對EclipseLink JAXB(MOXy)中的「@ XmlPath」擴展感興趣。以下是對象模型與XML文檔完全不同的示例:http://blog.bdoughan.com/2010/09/xpath-based-mapping-geocode-example.html。 – 2012-07-05 19:32:55
我看過'@ XmlPath'擴展名,但我不確定如何管理數據驅動的條件映射。例如,如果一個java對象的屬性可以映射到XML文檔中N個可能位置的子集,取決於數據,那麼將如何使用'@ XmlPath'擴展來完成?對不起,如果我錯過了明顯的東西! – Terence 2012-07-05 20:03:08
當對象模型與XML不同時,「@ XmlPath」擴展是有用的。如果您的主要關注點是現在擁有一個'XmlAdapter',那麼您可能更喜歡使用有狀態的'XmlAdapter':http://blog.bdoughan.com/2011/09/mixing-nesting-and-references-with。 html – 2012-07-05 20:09:55