2010-07-18 205 views
22

將XML轉換爲Java對象的最佳方式是什麼?將XML轉換爲Java對象

我不希望喜歡像表示法,但想從XML中提取某些數據並填充Java對象。我看了一下XStream,但並不喜歡整個「下移,上移」類型的東西。寫轉換器時,我寧願像DOM模型...

+0

西河看起來很好的唯一的事情是,我寧願用JDOM實現HierarchicalStreamReader的工作....我想我可以投,但這個好像有點怪怪的....有一種使用轉換器但使用JDOM閱讀器的方法? – 2010-07-18 16:16:07

回答

11

我知道每個人都喜歡像JAXB和這樣的自動解決方案,但我建議你手工編碼javax.xml.bind.Marshallerjavax.xml.bind.Unmarshaller實現,達到您想要的東西而不必填滿你的燙髮根空間。使用JDOM解析XML並使用XPath將值映射到Java對象。做一次這將會是一些工作,但是你將會擁有你所需要的,而不是更多。

+0

爲什麼你提到PermGen? – Abdull 2015-10-29 12:02:27

+3

您認爲JAXB生成的.class字節代碼在哪裏?可能與JDK8無關:沒有更多的燙髮。五年前我寫了這個答案。 – duffymo 2015-10-29 12:03:39

2

我不能完全肯定,如果這是你在找什麼,但你可以使用像XMLBeans將XML綁定到Java對象。我必須在以前的僱主中使用它。不幸的是,這是一個現有的系統,我只需要操作這些對象,而不必生成包含它們的庫。另外,我不確定如果沒有XSD,它的工作效果如何(您沒有提及是否有XSD)。

3

我喜歡Simple,發現它很容易使用。它確實產生了類似的代表性,雖然可能不是你想要的。

如果您正在尋找類似DOM的解決方案,那麼JDom可能適合。

21

如果你有一個XML模式,JAXB很好 - 作爲JDK的一部分。通過運行例如Java生成Java類xjc -p foo myschema.xsd

讀取XML文件,並返回一個對象(從由XJC工具生成的類):

JAXBContext context = JAXBContext.newInstance(FooObj.class); 
    Unmarshaller unMarshaller = context.createUnmarshaller(); 
    FooObj param = (FooObj) unMarshaller.unmarshal(new FileInputStream("Foo.xml")); 

你可以做類似的事情,如果你只想要一個XML文檔的一部分轉換爲對象,你應該例如能夠爲JAXB提供DOM文檔的一部分,而不是像上面那樣完成整個文件。

+1

+1 - 從Java類啓動時,您還可以使用JAXB(JSR-222)實現。您只需在希望XML表示與默認值不同的地方添加註釋即可:http://blog.bdoughan.com/2012/07/jaxb-no-annotations-required.html – 2012-12-05 11:28:04

3

您可以使用Castor將XML方便地轉換爲Java並返回。

Castor數據,你可以

  1. 易於轉換:一個簡單的Marshaller和Unmarshaller的使XML轉換爲Java和背部非常容易。
  2. 映射:可以創建一個映射文件來限制要從XML轉換回Java的數據量。
+0

Castor映射文件非常簡單且直觀: *只有當它是xml屬性時才能將值作爲構造函數參數傳遞(不支持元素作爲構造函數參數) *不能直接寫入私有字段 所以如果您在DDD方法中實現了域(no取而代之的是setter和構造函數)並輸入xml存儲信息作爲元素,所以沒有辦法使用castor – 2011-09-29 12:08:53

5

JAXB是將對象轉換爲XML的最佳方式,而MOXy是最好的JAXB實現。

  • JAXB is standard,包含在Java SE 6
  • 標準的XML綁定技術,JAX-WS,JAX-RS,和SCA
  • 簡單的運行時

莫西提供以下擴展名:

+0

我想從XML到對象的另一種方式。另外我的XML文檔非常大,我只想將一小部分數據解析到我的對象中。 – 2010-07-20 23:58:55

+1

JAXB/MOXy還支持XML到對象。你只需要映射你想要的其他內容將被忽略。基於MOXy的基於XPath的映射可以幫助您保留一個小對象模型。請參閱http://bdoughan.blogspot.com/2010/07/xpath-based-mapping.html – 2010-07-21 13:07:42