2012-03-05 55 views
0

首先。對不起英語不好。
我要讓地圖以XML一些「普遍」改造按照這種方式給出XSD:java通過XSD映射到XML

  • 地圖的關鍵將是等於在XML標記名稱在XML
  • 標籤名稱不會在不同節點(級別)中複製
  • Map中的值可以包含例如表示節點中可重複標記的Map列表
  • 創建的xml必須符合xsd。

所以我要尋找一個稱職的方式來實現這一點。
有沒有人從事類似的工作並能幫助我? 任何意見將不勝感激。提前致謝!

P.S.例。

Map: 
"fname" : "Asdf" 
"lname" : "Fdsa" 
"cars" : "car" {"car1", "car2", "car3"} 

XML:  
<fname>Asdf</fname> 
<lname>Fdsa</lname> 
<cars> 
    <car>car1</car> 
    <car>car2</car> 
    <car>car3</car> 
</cars> 
+0

你能寫下你想使用XML的例子嗎?這將有助於準確理解您的要求。 – AlexR 2012-03-05 12:43:43

+0

增加了一個簡單的例子。創建的XML文件將成爲某些Web服務(_service)的數據源。 _service將採用模板名稱和XML數據源並返回文檔。每個模板都有自己的模式。我怎樣才能實現這些要求? – A7iz 2012-03-05 12:55:26

回答

1

首先,您需要一個單根元素。這是XML語法的要求。 現在您可以使用JAXB。定義你的類數據:

@XmlType 
public class Data { 
    private String fname; 
    private String lname; 
    private Collection<String> cars; 

    // getters 
    public String getFname() { 
     return fname; 
    } 
    public String getLname() { 
     return lname; 
    } 
    @XmlElementWrapper(name = "cars") 
    @XmlElement(name = "car") 
    public String getCars() { 
     return cars; 
    } 


    // setters..... 
} 

現在,您可以創建一個類實例的實例,調用所有的setter方法來填充數據,然後調用:

JAXBContext ctx = JAXBContext.newInstance("com.yourpackage"); 
Marshaller m = ctx.createMarshaller(); 
m.marshal(data, System.out); 

你會看到你的數據在序列化爲XML STDOUT。

解析XML回說:

JAXBContext ctx = JAXBContext.newInstance("com.panpwr.api.model.deployment"); 
Unmarshaller unmarshaller = ctx.createUnmarshaller(); 
Data data = (Data)unmarshaller.unmarshal(in); // in is the input stream for XML 
// now your instance of data is populated from XML 
+0

謝謝你的迴應!但是如果我有幾個使用具有不同節點名稱,樹深度的相似模式的文檔模板呢?對於每個新模板,我只想創建XSD並使用apprpriate屬性填充Map,然後我的方法將它轉換爲XML。 .. – A7iz 2012-03-05 13:31:16

+0

您可以爲每個模式創建幾個帶註釋的數據類,也可以使用基於XML的映射。我個人比較喜歡帶註釋的課程。但在過去,我使用基於XML的映射與Digester。 – AlexR 2012-03-05 14:02:34

+0

非常感謝Alex!我會盡量按你的建議去做! – A7iz 2012-03-05 14:09:06