JAXB unmarshal神秘XML

时间:2014-09-09 15:20:37

标签: java xml jaxb

我正在使用JAXB来解组XML文件。

我所知道的XML文件是有效的XML。

我应该如何为newInstance指定类和/或包?

JAXBContext jaxbContext = JAXBContext.newInstance(??????);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
Object o = (Object) unmarshaller.unmarshal(myFile);

我在docs中没有看到解决此问题的任何内容。

2 个答案:

答案 0 :(得分:4)

您需要告诉JaxB要解组的类是什么,以便它可以使用类中的注释来解析xml的层次结构。您将需要一个也使用@XmlRootElement注释的类。如果要解析任意xml,可能需要对DocumentBuilder或xpath执行某些操作。

有关详细信息,请参阅此artical。

http://blog.bdoughan.com/2012/11/creating-generic-list-wrapper-in-jaxb.html

我使用过类似的东西将任意xml转换为类。 any字段实际上是org.w3c.dom.Element的列表,您可以从中获取信息。

http://docs.oracle.com/javase/7/docs/api/org/w3c/dom/Element.html

@XmlRootElement
class Wrapper {
        /**
         * Everything else
         */
        @Transient
        @XmlAnyElement(lax = true)
        private List<Element> any;


        public List<Element> getAny() {
            return any;
        }

}

答案 1 :(得分:0)

在newInstance中,您必须添加映射xml的类根元素...在示例

下面

这是一个例子..

public static void main(String[] args) throws JAXBException {
        final JAXBContext context = JAXBContext.newInstance(Vehicals.class);
        final Marshaller m = context.createMarshaller();
        m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

        final Vehicals vehicals = new Vehicals();

        List<Car> cars = new ArrayList<Car>();
        Car c = new Car();
        c.setName("Mercedes");
        cars.add(c);

        c = new Car();
        c.setName("BMW");
        cars.add(c);

        vehicals.setCar(cars);

        m.marshal(vehicals, System.out);
    }

<强> Vehicals.java

import java.util.List;

import javax.xml.bind.annotation.XmlRootElement;

    @XmlRootElement
    public class Vehicals {

        private List<Car> Car;

        public List<Car> getCar() {
            return Car;
        }

        public void setCar(List<Car> cars) {
            this.Car = cars;
        }
    }

<强> Car.java

import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

@XmlRootElement
public class Car {

    @XmlTransient
    private Long id;

    private String name;

    @XmlTransient
    private String code;


    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }
}

的Output.xml

<Vehicle>
     <Car>
         <name>Mercedes</name>
      </Car> 
     <Car>
         <name>BMW</name>
     </Car>
</Vehicle>

因为Unmarshal是一回事。在我的例子中,我在newInstance方法中添加了Vehicals作为参数。