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

时间:2013-01-03 13:58:45

标签: xml jaxb xstream spring-batch

我使用Spring批处理来解析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>

理想情况下,对于每个文档,我希望能够获得group的集合,并为每个组收集mail s

的集合

我不确定如何为此目的使用XStream ...是否可以实现我想用XStream做什么或者我需要JaxB?

2 个答案:

答案 0 :(得分:1)

XStream将是“最简单的”imho - 基本上允许您快速构建一组POJO,这些POJO将映射文档,然后使用XStream配置将文档解析为它们。例如对于rootDoc;

import java.io.Serializable;
import java.util.List;

public class Root implements Serializable {

private List<Group> groups;

//setters and getters...

}

为集团

import java.io.Serializable;
import java.util.List;

public class Group implements Serializable {

private String id;

private String box;

private String operator;

private List<Mail> mailItems;

//setters and getters...

}

和邮件物品

import java.io.Serializable;

public class Mail implements Serializable {

private String numMail;

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

现在您可以像使用任何父对象一样使用Root POJO并检索相应的Groups和Mail Items。

答案 1 :(得分:0)

XStream主要用于xml的编组和解组,你可以将xml解组为java对象,然后运行这些对象并执行任务。

如果你想对数据做出“反应”,我宁愿建议使用对不同标签做出反应的sax / stax阅读器。

由于提到了JaxB,它与XStream完全相同。根据经验,我几乎可以轻松地找到XStream。但是,如果您想更详细地了解差异,请查看此帖子:http://www.stackoverflow.com/questions/4230499/java-to-xml-conversions此帖还讨论了可能与您相关的其他几种解决方案。