解组多个元素具有相同名称的对象

时间:2012-09-08 18:34:36

标签: 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;
    }
}

我遇到异常,因为无法将类别强制转换为ExtendedCategory 如果我将顶级xml元素更改为其他内容(+扩展类别中的相应更改)

,则工作正常

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

1 个答案:

答案 0 :(得分:1)

@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