我有一个很大的XML文件,需要几个POJO类才能读取这个XML。当我尝试用一个POJO读取测试文件时,我使用以下命令:
JAXBContext jaxbContext = JAXBContext.newInstance(Test.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
Test ts = (Test)jaxbUnmarshaller.unmarshal(file);
System.out.println(ts.getName());但是当我有30个战俘时,我该怎么办?创建这4行30次吗?给我点建议。
更新
我如何从这个例子中理解http://blog.bdoughan.com/2010/08/using-xmlanyelement-to-build-generic.html使用我将要使用的几个POGOs
JAXBContext.newInstance("message:customer:product:order");在本文中,作者有三个层次,但其中只有两个层次,即@XmlRootElement注释。为什么?
发布于 2012-08-20 10:18:56
您可以使用所有的30个POJO创建JAXBContext。您还可以将它们的名称存储在包中的jaxb.index索引文件中,并创建JAXBContext.newInstance("your.package")
以下是来自jaxb.index的javadoc的一些详细信息
或者,与在上下文路径中列出相比,程序员带注释的JAXB映射类可以在jaxb.index资源文件中列出,格式如下所述。请注意,java包可以同时包含模式派生类和用户注释的JAXB类。此外,java包可能包含必须处理的JAXB包注释。(见JLS第3版,第7.4.1节。“包注释”)。
您的类应该使用@XmlRootElement或@XmlType注释进行注释。
此外,您可以使用扫描符号框架找到注释为@XmlRootElement的所有类,并使用所有JAXB创建JAXBContext。
如果你有问题,请发表意见,我会更新答案。希望能帮上忙。
发布于 2012-08-20 13:52:50
理想情况下,您应该只创建一次JAXBContext并缓存它以供重用。现在
,但是当我有30个POJO时,我该怎么办?创建以下4行30次?
如果您的30个POJO都在同一个包中(例如com.abc),那么将上下文创建为JAXBContext.newInstance("com.abc")
本文作者中的有3个clesses,但其中只有两个是whire @XmlRootElement注释。为什么?
只有与XSD中的全局元素声明相对应的POJO具有@XmlRootElement注释。这是因为全局元素声明是实例文档中潜在的根元素。
如果您可以发布XML和XML实例文档的示例,让我们提供一个更具体的答案,那就更好了。
发布于 2012-08-20 18:24:48
以下几点应该会有所帮助。
注解
JAXB模型类不需要任何注释。没有注释表明在创建JAXBContext时应自动处理类。
创建JAXBContext的
创建JAXBContext的主要方法有两种
1 -关于类
您传递一个域类数组。然后为这些类创建映射。还为引用创建映射(请参阅下面引入的类)。
2 -关于上下文路径
您引用的我的文章(http://blog.bdoughan.com/2010/08/using-xmlanyelement-to-build-generic.html)使用上下文路径。上下文路径由冒号分隔的包名组成。每个包必须包含一个jaxb.index文件或ObjectFactory类。jaxb.index文件是一个回车返回分隔的类名列表,您希望在其上创建JAXBContext。就像在类数组上创建JAXBContext一样,引用类也会被处理。
在中引入了哪些类
下面是有关创建JAXBContext时处理哪些次级类的一些关键概念。
1 -引用类
如果JAXBContext是在Foo类上创建的,那么Bar也将被处理,因为它是由Foo引用的。
@XmlAccessorType(XmlAccessType.FIELD)
public class Foo {
private List<Bar> bar;
}2 -超级类
如果一个类被处理,那么它的超类也会被处理。您可以将@XmlTransient注释放在类上,以防止其被处理(请参阅:http://blog.bdoughan.com/2011/06/ignoring-inheritance-with-xmltransient.html)。
public class Foo extends Bar {
}3 -子类
如果一个类被处理,那么它的子类不会被自动处理。您可以将@XmlSeeAlso注释放在类上,以指定您希望处理的子类。
@XmlSeeAlso({Bar.class})
public class Foo {
}4 -从JAXB注释引用的类
如果一个类被处理,那么在JAXB注释中指定的类也会被处理。
public class Foo {
@XmlElements({
@XmlElement(name="a", type=A.class),
@XmlElement(name="b", type=B.class)
})
private Object bar;
}https://stackoverflow.com/questions/12035811
复制相似问题