java - 解码多个元素的同名对象

标签 java xml jaxb

要解码的示例 xml 文件

  <category>
    <id>abcat0010000</id>
    <name>Gift Center</name>
    <path>
      <category>
        <id>cat00000</id>
        <name>Best Buy</name>
      </category>
      <category>
        <id>abcat0010000</id>
        <name>Gift Center</name>
      </category>
    </path>
    <subCategories>
      <category>
        <id>pcmcat140000050035</id>
        <name>Capturing Photos &amp; Videos</name>
      </category>
      <category>
        <id>pcmcat140000050036</id>
        <name>Listening to Digital Music</name>
      </category>
      <category>
        <id>pcmcat140000050037</id>
        <name>Computing Made Easy</name>
      </category>
      <category>
        <id>pcmcat140000050039</id>
        <name>Simple GPS Navigation</name>
      </category>
      <category>
        <id>pcmcat140000050040</id>
        <name>Playing Video Games</name>
      </category>
      <category>
        <id>pcmcat140000050041</id>
        <name>Watching HDTV</name>
      </category>
      <category>
        <id>pcmcat140000050042</id>
        <name>Enjoying Favorite Movies</name>
      </category>
      <category>
        <id>abcat0012000</id>
        <name>Him</name>
      </category>
      <category>
        <id>abcat0013000</id>
        <name>Teens</name>
      </category>
      <category>
        <id>abcat0014000</id>
        <name>Kids</name>
      </category>
    </subCategories>
  </category>

我的java对象

 @XmlRootElement(name="category")
    public class Category {
        String id;
        String name;

        public String getId() {
            return id;
        }

        @XmlElement
        public void setId(String id) {
            this.id = id;
        }

        public String getName() {
            return name;
        }

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

两种类型“类别”之间的关系不太令人困惑

@XmlRootElement("category")
public class ExtendedCategory extends Category {
    /*String id;
    String name;*/
    List<Category> path;
    List<Category> subCategories;

    /*public String getId() {
        return id;
    }

    @XmlElement
    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    @XmlElement
    public void setName(String name) {
        this.name = name;
    }
*/
    public List<Category> getPath() {
        return path;
    }

    @XmlElementWrapper(name="path")
    @XmlElement(name="category", type=Category.class)
    public void setPath(List<Category> path) {
        this.path = path;
    }

    public List<Category> getSubCategories() {
        return subCategories;
    }

    @XmlElementWrapper(name="subCategories")
    @XmlElement(name="category", type=Category.class)
    public void setSubCategories(List<Category> subCategories) {
        this.subCategories = subCategories;
    }
}

我收到异常,类别无法转换为扩展类别 如果我将顶级 xml 元素更改为其他内容(+扩展类别中的相应更改),则一切正常

如何解码多个元素具有相同名称的对象?

最佳答案

@XmlRootElement(name = "category")
public class Category {

    String id;
    String name;
    List<Category> path;
    List<Category> subCategories;

    public String getId() {
        return id;
    }

    @XmlElement
    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public List<Category> getPath() {
        return path;
    }

    @XmlElementWrapper(name = "path")
    @XmlElement(name = "category", type = Category.class)
    public void setPath(List<Category> path) {
        this.path = path;
    }

    public List<Category> getSubCategories() {
        return subCategories;
    }

    @XmlElementWrapper(name = "subCategories")
    @XmlElement(name = "category", type = Category.class)
    public void setSubCategories(List<Category> subCategories) {
        this.subCategories = subCategories;
    }
}   

我正在努力

   Category c = JAXB.unmarshal(new File("yourXml"), Category.class);

我得到了包含 2 个路径和 10 个子类别的类别,如您所需要。
下一页:

JAXB.marshal(c, System.out);  

我得到了与您的示例相同的 XML。

这个类效果很好。对于子类别,将字段 path 设置为 null,将字段 subCategories 设置为 null

关于java - 解码多个元素的同名对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12333412/

相关文章:

android - 我想在 Android Studio 中使用按钮样式 "Widget.Button.Transparent"

java - JAXB - 控制包装类中列表的元素名称

java - 如何使用 xml 模式为 xml 反序列化生成 java 类?

java - 在ElasticSearch 7.4 java客户端中的geoShapeQuery中使用geojson多边形

java - 无法向 build.sbt 添加任何依赖项

android - 时代广场日历XML文件错误

java - 如何使用 CXF 客户端发布 XML?

java - 如何根据 LDAP 中的证书搜索用户?

java - Android Studio - 使用 Junit 4.12 “!!! JUnit version 3.8 or later expected:”

java - 访问 Netbeans 从 XML 模式自动生成的列表