用Java读取XML文件

时间:2012-08-20 10:12:28

标签: java xml jaxb

我有一个大的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注释。为什么呢?

3 个答案:

答案 0 :(得分:6)

您可以使用所有30个POJO创建JAXBContext。您还可以将它们的名称存储在包中的jaxb.in​​dex索引文件中,并创建JAXBContext.newInstance(“your.package”)

以下是javadoc

中jaxb.in​​dex的一些细节
  

除了在上下文路径中列出之外,程序员带注释的JAXB映射类可以在jaxb.in​​dex资源文件中列出,格式如下所述。请注意,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}}