使用JAXB进行XML反序列化

5

我浏览了几乎所有与这个主题相关的问题,但是没有得到一个合适的解决方案。

我的问题如下:

我创建了一个简单的程序来对一个有 xsd 的 xml 文件进行反序列化。我成功地完成了这个任务。但是如果我得到一个没有 xsd 的 xml,如果 xml 看起来像这样:

<items>
  <item>
    <code>12000</code>
    <name>Samsung  620</name>
    <price>9999</price>
  </item>
  <item>
    <code>15000</code>
    <name>NOKIA</name>
    <price>19999</price>
  </item>
  <item>
    <code>18000</code>
    <name>HTC 620</name>
    <price>29999</price>
  </item>
</items> 

这里没有XSD文件可以用来生成我的类。我该怎么办?请帮帮我。

谢谢

2个回答

5
以下是一种将您的用例与JAXB (JSR-222)实现进行映射的方法: 项目 我们将使用以下类作为根对象,并用@XmlRootElement进行注释。 @XmlRootElement注释告诉JAXB,如果要解组的文档中的根元素是items,则应该实例化此类,您还可以指定不同的名称@XmlRootElement(name="foo")
package forum11152046;

import java.util.List;
import javax.xml.bind.annotation.*;

@XmlRootElement
public class Items {

    private List<Item> items;

    @XmlElement(name="item")
    public List<Item> getItems() {
        return items;
    }

    public void setItems(List<Item> items) {
        this.items = items;
    }

}

项目

在这个例子中,我创建了一个类,其中所有属性名称直接对应于XML文档中的名称。这意味着不需要添加任何注释。如果您需要覆盖默认名称,则可以使用注释,例如@XmlElement。我在Items类中使用@XmlElement注释来为items属性进行覆盖。

package forum11152046;

public class Item {

    private int code;
    private String name;
    private int price;

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getName() {
        return name;
    }

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

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

}

演示

package forum11152046;

import java.io.File;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Items.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum11152046/input.xml");
        Items items = (Items) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(items, System.out);
    }

}

input.xml/Output

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<items>
    <item>
        <code>12000</code>
        <name>Samsung  620</name>
        <price>9999</price>
    </item>
    <item>
        <code>15000</code>
        <name>NOKIA</name>
        <price>19999</price>
    </item>
    <item>
        <code>18000</code>
        <name>HTC 620</name>
        <price>29999</price>
    </item>
</items>

3
Blaise Doughan总能提供答案。我认为我应该使用MOXy而不是JAXB-RI。 - Jin Kwon

2
如果您想继续使用JAXB,您可以编写一个XML模式文档来验证这样的XML(看起来很简单,但它只是一个实例,您需要事先找出这些文档中可能会发生什么变化),或者创建一个POJO,其中包含与这些节点相匹配的JAXB注释。恐怕没有其他方法。您仍然必须很好地了解格式允许的内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接