2011-01-25 117 views
1

我正在使用動態xml表格格式,該格式由指定列名稱和類型的模式以及包含行的值標記組成。由它生成將java對象轉換爲動態xml

<xs:complexType name="data"> 
    <xs:sequence> 
     <xs:element name="schema" type="schema"/> 
     <xs:element name="values" type="values"/> 
    </xs:sequence> 
</xs:complexType> 

<xs:complexType name="schema"> 
    <xs:anyAttribute/> 
</xs:complexType> 

<xs:complexType name="values"> 
    <xs:anyAttribute/> 
</xs:complexType> 

而且一個示例XML:下面XSD的簡化版本

<data> 
    <schema firstName="string" lastName="string" age="integer"> 
    <values> 
     <value firstName="A" lastName="B" age="23"/> 
     <value firstName="C" lastName="D" age="63"/> 
     … 
    </values> 
</data> 

數據生成XML來自數據對象的列表,在我們的例子:

public class Person { 
    private String firstName; 
    private String lastName; 
    private int age; 

    // getters and setters… 
} 

目前我正在通過向類中添加如下代碼來創建它(我使用jaxb生成xml):

private static QName FIRST_NAME = new QName("firstName"); 
private static QName LAST_NAME = new QName("lastName"); 
private static QName AGE = new QName("age"); 

private static Map<QName, String> schema; 

static { 
    schema = new HashMap<QName, String>(); 
    schema.put(FIRST_NAME, "string"); 
    schema.put(LAST_NAME, "string"); 
    schema.put(AGE, "integer"): 
} 

public Map<QName, String> asMap() { 
    Map<QName, String> map = new HashMap<QName, String>(); 
    map.put(FIRST_NAME, firstName); 
    map.put(LAST_NAME, lastName); 
    map.put(AGE, Integer.toString(age)): 
    return map; 
} 

public static Map<QName, String> getSchema() { 
    return schema; 
} 

然後爲每個將用於生成xml的數據對象執行此操作。雖然我不覺得這是最好的解決方案,但這起作用。我看到的主要問題是模式和值之間沒有聯繫,如果其中一個變化,你必須記得更新另一個。此外,它有點嘈雜,將其添加到所有類。

有人可能會建議一個更好的(更清潔/更通用)的方式嗎?也許一些自動生成模式和/或值映射的好方法?或者任何其他建議......如果我可以在沒有改變類的情況下給出任何java bean的東西,那可能會是最好的,但是如果有必要,我可以很好地裝飾/添加東西給類。 )

謝謝

回答

2

整個問題是表是動態的。它需要成爲?

如果不是,解決方案很簡單,因爲你可以做一個靜態表,然後將其綁定到使用JAXB的Java bean。

如果它需要是動態的,那麼你可以做的唯一的事情是表使用定製綁定的Java bean的鏈接靜態實例。這意味着如果您有一個包含firstName,lastName和age的表的靜態實例,那麼您可以編寫一個自定義綁定器,該綁定器將從該表中生成Java Bean,該綁定將具有適當的綁定(firstName,lastName和age),即你現在在做什麼手動。這種方法的問題在於編寫綁定工具。

但使用現成的,現成的軟件,最容易做的事情是不使用動態表,而是寫模式爲動態表的每個實例。來自這些模式的XML文檔仍然符合定義動態表格的XML文檔,但它將允許您使用JAXB來自動化所有代碼生成並使Java類與XML文檔保持同步。

+0

同意。然而,要做動態部分,首先可以將POJO「序列化」爲地圖,然後從地圖轉換爲XML(或JSON等)。這可能會更容易解決問題。 JAXB不能做以前的(我認爲),但是從common-beans-utils到Jackson的任何東西都可以工作。 – StaxMan 2011-01-25 21:24:12