【问题标题】:How Creating and Parsing XML with JAXB?如何使用 JAXB 创建和解析 XML?
【发布时间】:2014-03-29 08:48:01
【问题描述】:

我有三个类在 java(project,layer,image) 中,我想将所有这些文件解析为 XML,但是我在通过 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;
   }
}

图层类:

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

【问题讨论】:

    标签: java xml jaxb


    【解决方案1】:

    @XmlElementWrapper 用于向集合添加分组元素。像您正在做的那样在非收藏属性上使用它是无效的。如果您将其删除,则一切正常。

    如果您仍然无法解组:

    1. 填充您的模型并查看 XML 的外观,查看它与输入 XML 的不同之处并相应地更新您的映射。
    2. 更新您的问题以包含您遇到的任何例外情况。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-12-25
        • 1970-01-01
        • 2023-03-09
        • 1970-01-01
        • 2014-11-21
        • 1970-01-01
        相关资源
        最近更新 更多