2017-04-02 69 views
0

我正在使用JAXB创建一个xml数据模型,它似乎非常适合非复杂的XML模型,但只要我进入稍微复杂的XML,JAXB似乎并没有起作用。如何使用Jaxb嵌套POJO类来生成Java中的XML模型

这是XML代我想acheive:

<?xml version="1.0" encoding="UTF-8"?> 
<SampleRoot xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:noNamespaceSchemaLocation="Sample.xsd"> 

    <Name>Sample Name</Name> 
    <Description>This is a description</Description> 
    <Graph>Graph test</Graph> 

    <VerifyAttr> 
     <Data>id</Data> 
     <Value>32</Value> 
    </VerifyAttr> 

    <VeirfyXpath> 
     <MemXpath>/Root/Name</MemXpath> 
     <Value>Mosawi</Value> 
    </<VeirfyXpath>> 

</SampleRoot> 

这是嵌套POJO类,我创建了(我不应该创建一个嵌套的POJO或许他们分开了?):

package com.sample.model; 

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement(name="SampleRoot") 
public class Sample { 
    private String name; 
    private String description; 
    private String graph; 

    public String getName() { 
     return name; 
    } 
    @XmlElement 
    public void setName(String name) { 
     this.name = name; 
    } 
    public String getDescription() { 
     return description; 
    } 
    @XmlElement 
    public void setDescription(String description) { 
     this.description = description; 
    } 
    public String getGraph() { 
     return graph; 
    } 
    @XmlElement 
    public void setGraph(String graph) { 
     this.graph = graph; 
    } 

    @XmlAccessorType(XmlAccessType.FIELD) 
    public class VerifyAttr { 
     private String data; 
     private String value; 

     public String getData() { 
      return data; 
     } 
     @XmlElement 
     public void setData(String data) { 
      this.data = data; 
     } 
     public String getValue() { 
      return value; 
     } 
     @XmlElement 
     public void setValue(String value) { 
      this.value = value; 
     } 

    } 

    @XmlAccessorType(XmlAccessType.FIELD) 
    public class VerifyXpath { 
     private String memXpath; 
     private String value; 

     public String getMemXpath() { 
      return memXpath; 
     } 
     @XmlElement 
     public void setMemXpath(String memXpath) { 
      this.memXpath = memXpath; 
     } 
     public String getValue() { 
      return value; 
     } 
     @XmlElement 
     public void setValue(String value) { 
      this.value = value; 
     } 

    } 

} 

这里是锻炼POJO模型演示:

public static void main(String[] args) { 
    Sample sample = new Sample(); 

    sample.setName("Name"); 
    sample.setDescription("This is a description"); 
    sample.setGraph("Graph Test"); 

    VerifyAttr va = sample.new VerifyAttr(); 
    va.setData("id"); 
    va.setValue("32"); 

    VerifyXpath vx = sample.new VerifyXpath(); 
    vx.setMemXpath("/Root/Name"); 
    vx.setValue("Mosawi"); 


    try { 
     JAXBContext jaxbContext = JAXBContext.newInstance(Sample.class); 
     Marshaller jaxbMarshaller = jaxbContext.createMarshaller(); 

     jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 

     jaxbMarshaller.marshal(sample, new File("Sample.xml")); 
     jaxbMarshaller.marshal(sample, System.out); 

    } catch(Exception e) { 
     e.printStackTrace(); 
    } 
} 

我的问题是,是t他没有生成上面定义的完整的XML。这是什么产生的:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<SampleRoot> 
    <description>This is a description</description> 
    <graph>Graph Test</graph> 
    <name>Name</name> 
</SampleRoot> 

我在做什么错?为什么我没有像上面那样获取模型XML?问题是与demo main

回答

0

好吧,我可以通过阅读一些JaxB文档来了解这一点。我已经分离了的POJO分为3类,并调整了JAXB注释:

Sample.java VerifyAttr.java VerifyXpath.java

VerifyAttr.java

@XmlRootElement 
@XmlAccessorType(XmlAccessType.PROPERTY) 
@XmlType(propOrder={"dataAttr","valueAttr"}) 
public class VerifyAttr { 
    //... 
} 

VerifyXpath.java

@XmlRootElement 
@XmlAccessorType(XmlAccessType.PROPERTY) 
@XmlType(propOrder={"dataXpath","valueXpath"}) 
public class VerifyAttr { 
    //... 
} 

和根节点顶级:

Sample.java

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class VerifyAttr { 
    @XmlElement(name="VerifyAttr", type=VerifyAttr.class) 
    private ArrayList<VerifyAttr> va; 

    @XmlElement(name="VerifyXpath", type=VerifyXpath.class) 
    private ArrayList<VerifyXpath> vx; 

    // some other fields 
    //..getter and setters 
} 

希望这可以帮助其他人新JAXB