使用Spring批处理将复杂XML解组为java

使用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

我使用SpringBatch解析XML文档,并对这些XML文档中包含的数据进行处理

我有以下文件:

<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);