使用Spring批处理将复杂XML解组为java
我使用SpringBatch解析XML文档,并对这些XML文档中包含的数据进行处理 我有以下文件:使用Spring批处理将复杂XML解组为java,xml,jaxb,xstream,spring-batch,Xml,Jaxb,Xstream,Spring Batch,我使用SpringBatch解析XML文档,并对这些XML文档中包含的数据进行处理 我有以下文件: <rootDoc> <group id="13001L000001" box="13000B000001" operator="jsmith"> <mail numMail="3A06049714560"/> <mail numMail="3A06049714561"/> <mail numMail="3A06049
<rootDoc>
<group id="13001L000001" box="13000B000001" operator="jsmith">
<mail numMail="3A06049714560"/>
<mail numMail="3A06049714561"/>
<mail numMail="3A06049714562"/>
<mail numMail="3A06049714565"/>
</group>
<group id="13001L000002" box="13000B000001" operator="jsmith">
<mail numMail="3A06049714570"/>
<mail numMail="3A06049714571"/>
<mail numMail="3A06049714572"/>
<mail numMail="3A06049714575"/>
</group>
</rootDoc>
理想情况下,对于每个文档,我希望能够获得组
s的集合,对于每个组,我希望能够获得邮件
s的集合
我不知道如何使用XStream来达到这个目的。。。有可能实现我想用XStream做的事情吗?或者我需要JaxB吗?XStream主要用于xml的编组和解组,您可以做的是将xml解组为java对象,然后运行这些对象并执行任务 如果您想在数据出现时对其进行“反应”,我建议您使用sax/stax读取器对不同的标记进行反应
由于提到了JaxB,它的功能与XStream基本相同。根据我的经验,我发现XStream非常容易使用。然而,如果你想更详细地了解这些差异,请看这篇文章:这篇文章还讨论了其他几种可能与你相关的解决方案 XStream将是“最简单”的imho——本质上允许您快速构建一组POJO,映射文档,然后使用XStream配置将文档解析为它们。例如rootDoc
import java.io.Serializable;
import java.util.List;
public class Root implements Serializable {
private List<Group> groups;
//setters and getters...
}
要为此对象设置XStream,可以使用以下配置
XStream xstream = new XStream(new StaxDriver());
xstream.alias("mail", Mail.class);
xstream.useAttributeFor(Mail.class,"numMail");
xstream.alias("group", Group.class);
xstream.useAttributeFor(Group.class, "box");
xstream.useAttributeFor(Group.class, "id");
xstream.useAttributeFor(Group.class, "operator");
xstream.addImplicitCollection(Group.class, "mailItems");
xstream.alias("rootDoc", Root.class);
xstream.addImplicitCollection(Root.class, "groups");
并使用它来阅读文档
Root result = (Root) xstream.fromXML(...source);
现在,您可以像使用任何父对象一样使用根POJO并检索相应的组和邮件项目。JAXB(JSR-222)设计为从Java类开始。您不需要从XML模式生成它们:谢谢,我显然错过了这一点。我编辑了我的答案,所以我不想误导其他人。我不熟悉SpringBatch,但该XML文档的JAXB映射非常简单。下面的文章应该可以帮助您开始工作:
XStream xstream = new XStream(new StaxDriver());
xstream.alias("mail", Mail.class);
xstream.useAttributeFor(Mail.class,"numMail");
xstream.alias("group", Group.class);
xstream.useAttributeFor(Group.class, "box");
xstream.useAttributeFor(Group.class, "id");
xstream.useAttributeFor(Group.class, "operator");
xstream.addImplicitCollection(Group.class, "mailItems");
xstream.alias("rootDoc", Root.class);
xstream.addImplicitCollection(Root.class, "groups");
Root result = (Root) xstream.fromXML(...source);