У меня есть три класса В java (проект, слой, изображение), я хочу, чтобы весь синтаксический анализатор все XML файл, но у меня проблема в парсере, этот атрибут XML по проекту JAXB-класса имеет атрибут из слоя и слоя, имеющий атрибут из образа. Что мне нужно в конце:
<?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;
}
}
Класс уровня:
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;
}
}
@XmlElementWrapper
используется для добавления элемента группировки в коллекции. Нельзя использовать его в качестве не-коллекции, как вы это делаете. Если вы удалите его, все должно сработать.
Если вы все еще не можете размотать:
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;
}
}
Класс уровня:
@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;
}
}