首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Java读取XML文件

问用Java读取XML文件
EN

Stack Overflow用户
提问于 2012-08-20 10:12:28
回答 3查看 540关注 0票数 4

我有一个很大的XML文件,需要几个POJO类才能读取这个XML。当我尝试用一个POJO读取测试文件时,我使用以下命令:

代码语言:javascript
复制
    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

代码语言:javascript
复制
JAXBContext.newInstance("message:customer:product:order");

在本文中,作者有三个层次,但其中只有两个层次,即@XmlRootElement注释。为什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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。

如果你有问题,请发表意见,我会更新答案。希望能帮上忙。

票数 6
EN

Stack Overflow用户

发布于 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实例文档的示例,让我们提供一个更具体的答案,那就更好了。

票数 1
EN

Stack Overflow用户

发布于 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引用的。

代码语言:javascript
复制
@XmlAccessorType(XmlAccessType.FIELD)
public class Foo {

    private List<Bar> bar;

}

2 -超级类

如果一个类被处理,那么它的超类也会被处理。您可以将@XmlTransient注释放在类上,以防止其被处理(请参阅:http://blog.bdoughan.com/2011/06/ignoring-inheritance-with-xmltransient.html)。

代码语言:javascript
复制
public class Foo extends Bar {
}

3 -子类

如果一个类被处理,那么它的子类不会被自动处理。您可以将@XmlSeeAlso注释放在类上,以指定您希望处理的子类。

代码语言:javascript
复制
@XmlSeeAlso({Bar.class})
public class Foo {
}

4 -从JAXB注释引用的类

如果一个类被处理,那么在JAXB注释中指定的类也会被处理。

代码语言:javascript
复制
public class Foo {
    @XmlElements({
         @XmlElement(name="a", type=A.class),
         @XmlElement(name="b", type=B.class)
    })
    private Object bar;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12035811

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档