2012-03-05 61 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