2011-09-01 56 views
3

我正在尋找最佳工具/方法來創建和加載XML定義的JAVA對象。 我已經簽出JAXB,看起來相當不錯,但沒有找到有什麼方法可以與實體一起工作,哪些屬性是動態的,或者不時地改變,所以想要像自動方式一樣使用實體,而沒有將Object轉換爲預定義的實體對象。有這樣的事情存在嗎?Java unmashlling XML to Object這是動態的

工作流會像這樣從XML讀取創建類爲每個實體設置動態屬性和/或爲這些實體創建ORM映射部分然後所有操作檢索/存儲到數據庫中或者可能會使用一些NoSQL解決方案像MongoDB一樣。

+0

如果我得到你的權利,你可能有興趣在這兩個職位:http://stackoverflow.com/questions/4248099/jaxb-dynamically-generate-java-sources-without-xjc和http://stackoverflow.com/questions/4556179/how-to-force-schema-compiled-classes-to-extend-specific-class-outside-schema這是我如何從xml生成java類。 – Osw

回答

2

所以,你基本上試圖使用XML文件來創建POJO(普通的舊Java對象)?它們就像數據類一樣,對嗎?

我是XStream的忠實粉絲,如果您不需要驗證,它非常易於使用且效果極佳。當需要對模式進行驗證時,我使用了Castor。我只是用XStream將一個對象保存到一個xml文件中,然後我可以從任何地方將它讀回來,即使我改變了與該對象相關的數據值(我認爲這就是「動態屬性集」的意思,對?)。

+0

是的我試圖製作POJO對象並使用它們,該XML文件包含每個實體的定義,模式樣式和架構應該隨時更改。我需要建立一個管理POJO對象的動態方法。所有數據都將存儲在MongoDB中,並且此POJO對象將從那裏加載它們,所以此XML僅包含POJO對象的定義。驗證是沒有必要的。 – vaske

2

注:我是EclipseLink JAXB (MOXy)鉛和JAXB 2(JSR-222)專家組的成員。


查看以下EclipseLink示例。它演示瞭如何使用動態特性與JPA都和JAXB實現:


選項#1 - 帶有動態屬性靜態對象

莫西有一個@XmlVirtualAccessMethods擴展名,它允許您將地圖中的條目映射到XML。這使您可以將屬性添加到靜態類。在下面的示例中,Customer類具有「真實」名稱屬性,並且可能具有許多「虛擬」屬性。

package blog.metadatasource.refresh; 

import java.util.*; 
import javax.xml.bind.annotation.*; 
import org.eclipse.persistence.oxm.annotations.XmlVirtualAccessMethods; 

@XmlRootElement 
@XmlType(propOrder={"firstName", "lastName", "address"}) 
@XmlVirtualAccessMethods 
public class Customer { 

    private String name; 
    private Map<String, Object> extensions = new HashMap<String, Object>(); 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public Object get(String key) { 
     return extensions.get(key); 
    } 

    public void set(String key, Object value) { 
     extensions.put(key, value); 
    } 

} 

虛擬屬性通過MOXy的XML元數據定義。在下面的例子中,我們將添加兩個屬性:middleName和shippingAddress。

<?xml version="1.0"?> 
<xml-bindings 
    xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm" 
    package-name="blog.metadatasource.refresh"> 
    <java-types> 
     <java-type name="Customer"> 
      <java-attributes> 
       <xml-element 
        java-attribute="middleName" 
        name="middle-name" 
        type="java.lang.String"/> 
       <xml-element 
        java-attribute="shippingAddress" 
        name="shipping-address" 
        type="blog.metadatasource.multiple.Address"/> 
      </java-attributes> 
     </java-type> 
    </java-types> 
</xml-bindings> 

更多信息


選項#2 - 動態對象

莫西也提供了完整的動態對象模型:

DynamicJAXBContext jaxbContext = DynamicJAXBContextFactory.createContextFromXSD(xsdInputStream, null, null, null); 

Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); 
DynamicEntity customer = (DynamicEntity) unmarshaller.unmarshal(inputStream); 

DynamicEntity address = jaxbContext.newDynamicEntity("org.example.Address"); 
address.set(street, "123 A Street"); 
address.set(city, "Any Town"); 
customer.set("address", address); 

Marshaller marshaller = jaxbContext.createMarshaller(); 
marshaller.marshal(customer, System.out); 

更多信息

+0

看起來不錯,但是如果我們不知道未來的POJO對象的確切結構,有沒有辦法管理這些事情,在你使用「firstName」,「lastName」,「address」這個固定的例子中,如果我想讓它動態? – vaske

+0

@vaske - 對於選項#1(具有動態屬性的靜態模型),名稱屬性是靜態的(用'getName()'/'setName(「Jane」)'訪問,中間名屬性是動態的get(「middleName」)'/'set(「middleName」,「Anne」)'。 –

+0

謝謝是的就是這樣,關於類名,我將從XML文件中提取它們,基本上所有的實體都會一個文件,然後我將讀取它並創建POJO對象,並將其用作應用程序中使用的映射源 – vaske