我有一个大的XML文件和几个POJO clasess需要读取这个XML。当我尝试用一个POJO读取测试文件时,我使用它:
JAXBContext jaxbContext = JAXBContext.newInstance(Test.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
Test ts = (Test)jaxbUnmarshaller.unmarshal(file);
System.out.println(ts.getName());
但是当我有30个POJO时,我会怎么做?创建这4行30次?给我建议。
更新
我如何理解这个例子http://blog.bdoughan.com/2010/08/using-xmlanyelement-to-build-generic.html 使用几个POGO我会用
JAXBContext.newInstance("message:customer:product:order");
在这个考试中,autor有3个咒语,但只有两个,他恳求@XmlRootElement
注释。为什么呢?
答案 0 :(得分:6)
您可以使用所有30个POJO创建JAXBContext。您还可以将它们的名称存储在包中的jaxb.index索引文件中,并创建JAXBContext.newInstance(“your.package”)
以下是javadoc
中jaxb.index的一些细节除了在上下文路径中列出之外,程序员带注释的JAXB映射类可以在jaxb.index资源文件中列出,格式如下所述。请注意,java包可以包含模式派生类和用户注释的JAXB类。此外,java包可能包含必须处理的JAXB包注释。 (参见JLS第3版,第7.4.1节“封装注释”)。
您的类应使用@XmlRootElement或@XmlType注释进行注释。
您还可以使用scannotation框架找到所有注释为@XmlRootElement的类,并使用您拥有的所有JAXB POJO创建JAXBContext。
如果您有任何问题,请发表评论,我会更新答案。 希望它有所帮助。
答案 1 :(得分:1)
理想情况下,您只需创建一次JAXBContext并将其缓存以便重复使用。现在
但是当我有30个POJO时,我会怎么做?创建这4行30次?
如果您的所有30个POJO都在同一个包中(例如com.abc),那么将上下文创建为JAXBContext.newInstance("com.abc")
在这个考试中,autor有3个咒语,但只有两个,他就是@XmlRootElement注释。为什么? 的
只有与XSD架构中的全局元素声明对应的POJO才具有@XmlRootElement
注释。这是因为全局元素声明是实例文档中的潜在根元素。
如果您可以发布XML Schema和XML实例文档的示例,以便我们提供更具体的答案,那会更好。
答案 2 :(得分:1)
以下内容应该有所帮助。
<强>注解强>
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;
}
。
@XmlTransient
2 - 超级课程
如果处理了一个类,那么它的超类也会被处理。您可以在类上放置public class Foo extends Bar {
}
注释以防止对其进行处理(请参阅:http://blog.bdoughan.com/2011/06/ignoring-inheritance-with-xmltransient.html)。
@XmlSeeAlso
3 - 子类
如果处理了类,则不会自动处理其子类。您可以将@XmlSeeAlso({Bar.class})
public class Foo {
}
注释放在类上以指定您希望处理的子类。
public class Foo {
@XmlElements({
@XmlElement(name="a", type=A.class),
@XmlElement(name="b", type=B.class)
})
private Object bar;
}
4 - 从JAXB注释中引用的类
如果处理了类,则也会处理该类中JAXB注释上指定的类
{{1}}