我正在使用JAXB来解组XML文件。
我所知道的XML文件是有效的XML。
我应该如何为newInstance指定类和/或包?
JAXBContext jaxbContext = JAXBContext.newInstance(??????);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
Object o = (Object) unmarshaller.unmarshal(myFile);
我在docs中没有看到解决此问题的任何内容。
答案 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作为参数。