2014-03-29 35 views
1

我有三个类在java(项目,图层,图像),我想解析器所有这个文件到XML但我有问题解析器这个属性到XML由JAXB类项目有属性从图层和层有属性的图像。 我到底需要什么:如何使用JAXB创建和解析XML?

<?xml version="1.0" encoding="UTF-8"?> 
    <project name=""> 
     <Layer id="1"> 
     <image id="1"> 
      </image> 
     <image id="2"> 
      </image> 
     </layer> 
     <Layer id="2"> 
     <image id="1"> 
     </image> 
     <image id="2"> 
     </image> 
     </layer> 
    <project> 

项目类:

@XmlRootElement 
@XmlAccessorType(XmlAccessType.PROPERTY) 
public class Project { 
    private String name; 
    private Layer[] layer; 
@XmlAttribute(name = "name") 
public String getName() { 
    return name; 
} 
public void setName(String name) { 
    this.name = name; 
} 
    @XmlElement(name = "layer") 
    public Layer[] getLayer() { 
     return layer; 
    } 
} 

Layer类:

public class Layer { 
    private int id; 
    private Image[] images; 
    @XmlElementWrapper(name="Layer") 
    @XmlAttribute(name="id") 
    public int getId() { 
    return id; 
    } 
    public void setId(int id) { 
    this.id = id; 
    } 
    @XmlElement(name="images") 
    public Image[] getImages() { 
    return images; 
    } 

    public void setImages(Image[] images) { 
    this.images = images; 
    } 
} 

图片类:

public class Image { 
    private int id; 
    @XmlElementWrapper(name="Image") 
    @XmlAttribute(name="id") 
    public int getId() { 
    return id; 
    } 
    public void setId(int id) { 
    this.id = id; 
    } 
} 

回答

0

@XmlElementWrapper用于将分组元素添加到集合。像你在做的那样,在非集合属性上使用它是无效的。如果你删除它的东西应该工作。

如果您仍然无法解组:

  1. 填充你的模型,看看XML的样子,看到它从你输入的XML不同,相应地更新您的映射。
  2. 更新您的问题以包括您所得到的任何例外情况。
0

XML文件:

<?xml version="1.0" encoding="UTF-8"?> 
<Project name=""> 
    <Layer id="1"> 
     <Image id="1"></Image> 
     <Image id="2"></Image> 
    </Layer> 
    <Layer id="2"> 
     <Image id="1"></Image> 
     <Image id="2"></Image> 
    </Layer> 
</Project> 

项目类:

@XmlRootElement(name="Project") 
@XmlAccessorType(XmlAccessType.PROPERTY) 
public class Project { 

    private String name; 
    private List<Layer> layers; 

    @XmlAttribute(name ="name") 
    public String getName() { 
    return name; 
    } 

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

    public List<Layer> getLayers() { 
    return layers; 
    } 

    @XmlElement(name = "Layer") 
    public void setLayers(List<Layer> layers) { 
    this.layers = layers; 
    } 

} 

Layer类:

@XmlAccessorType(XmlAccessType.PROPERTY) 
public class Layer { 

    private int id; 
    private List<Image> images; 

    @XmlAttribute(name="id") 
    public int getId() { 
    return id; 
    } 

    public void setId(int id) { 
    this.id = id; 
    } 

    @XmlElement(name="Image") 
    public List<Image> getImages() { 
    return images; 
    } 

    public void setImages(List<Image> images) { 
    this.images = images; 
    } 
} 

图片类:

@XmlAccessorType(XmlAccessType.PROPERTY) 
public class Image { 

    private int id; 

    @XmlAttribute(name="id") 
    public int getId() { 
    return id; 
    } 

    public void setId(int id) { 
    this.id = id; 
    } 
} 

并测试分类:

public class Main { 

    public static void main(String[] args) 
    { 
    Project project = unmarshal(); 
    marshal(project); 
    } 

    public static void marshal(Project pr) 
    { 

    Project project; 
    if(pr==null) 
    { 
     project = new Project(); 

     Image image1 = new Image(); 
     image1.setId(1); 

     Image image2 = new Image(); 
     image2.setId(2); 

     List<Image> images=new ArrayList<>(); 
     images.add(image1); 
     images.add(image2); 

     Layer layer1 = new Layer(); 
     layer1.setId(15); 
     layer1.setImages(images); 

     Layer layer2 = new Layer(); 
     layer2.setId(15); 
     layer2.setImages(images); 

     List<Layer> layers = new ArrayList<>(); 
     layers.add(layer1); 
     layers.add(layer2); 

     project.setName("peoject123"); 
     project.setLayers(layers); 
    } 
    else 
    { 
     project = pr; 
    } 

    try { 

     File file = new File("src/project-out.xml"); 
     JAXBContext jaxbContext = JAXBContext.newInstance(Project.class); 
     Marshaller jaxbMarshaller = jaxbContext.createMarshaller(); 

     // output pretty printed 
     jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 

     jaxbMarshaller.marshal(project, file); 
     jaxbMarshaller.marshal(project, System.out); 

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

    public static Project unmarshal() { 
    Project project=null; 
    try { 
     File file = new File("src/project.xml"); 
     JAXBContext jaxbContext = JAXBContext.newInstance(Project.class); 

     Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); 
     project = (Project) jaxbUnmarshaller.unmarshal(file); 

    } catch (JAXBException e) { 
     e.printStackTrace(); 
    } 
    return project; 
    } 
}