Как создавать и анализировать XML с помощью JAXB?

1

У меня есть три класса В 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;
    }
}
Теги:
jaxb

2 ответа

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;
  }

}

Класс уровня:

@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;
  }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню