java - xstream 使用 Converter 将复杂的 XML 反序列化为更简单的 java

标签 java xml xml-parsing xstream

我对 Xstream 转换器的理解肯定有问题。

我有一个来自遗留后台应用程序的非常复杂的 XML,并且只想将其转换为更简单的 java 类或带有转换器的 Map。

  1. 我不想编码为 XML,只是解码
  2. 我不想使用注释,只是 KISS

我的 XML 就像

<root>
    <agent>
        <id>123456789</id>
        <name>GABIN</name>
        <forname>Jean</forname>
        <unit>
            <legacyReference>AA</legacyReference>
            <name>SAN ANTONIO</name>
            <legacyName>SA</legacyName>
            <address>
                <number>1</number>
                <street>Sesam street</street>
                <city>NoWhere</city>
                <legacyID>AAZE-56</legacyID>
            </address>
            <legacyStructurBlablabla>
                <type>OFFICE</type>
                <data>
                    <foo>BAR</foo> 
                </data>
            </legacyStructurBlablabla>
            <...>
        </unit>
        <...> 
    </agent>
</root>

我的目标类非常简单

class Agent {
    String id;
    String name;
    String forname;
    String unitName;
    String unitType;
    <...>

}

我的主要方法看起来像

xStream = new XStream(new DomDriver());
stream = this.getClass().getClassLoader().getResourceAsStream("data/agent.xml") ;
xStream.alias("root", Map.class);
xStream.alias("agent", Agent.class);
xStream.registerConverter(new ResultConverter());
xStream.registerConverter(new AgentConverter());
xStream.ignoreUnknownElements();

Object obj = xStream.fromXML(stream);

我不明白如何下台转而支持另一个转换器。

public class ResultConverter implements Converter {

...


public Object unmarshal(HierarchicalStreamReader reader,
        UnmarshallingContext context) {
    Map<String, Object> agents = new HashMap<String, Object>();
    while( reader.hasMoreChildren() ) {
        reader.moveDown();
        // HOW I DO TO STEP DOWN IN FAVOR OF Agent CONVERTER ?
        reader.moveUp();
    }
    return agents;
}

我没有看到 Xstream 向下滚动以激活我的 AgentConverter。

我肯定没有捕获要点

编辑

Xstream 可能不是适合此目的的工具。 根据 Cfx 的建议,我会使用 xmlbeam。 XMLBeam 根据 XPATH 映射将 XML 投影到 Java 类。

最佳答案

似乎您不希望 xml 结构反射(reflect)在您的 Java 类中。如果你坚持使用XStream,我没有解决办法。但有一个alternative framework正是为了解决这个问题而制定的。它使用注释,但恕我直言,并没有违反 KISS 原则。 这是一个例子:

public interface Agent {

@XBRead("/root/agent/id")
String getId();

@XBRead("/root/agent/name")
String getName();

@XBRead("/root/agent/forename")
String getForname();

@XBRead("/root/agent/unit/name")
String getUnitName();

@XBRead("/root/agent/unit/legacyStructurBlablabla/type")
String getUnitType();

}

您将定义接口(interface)而不是类,但这些接口(interface)的实例可以像 POJO 一样使用。 (使用 toString()、equals()、hashCode,...)。 创建这些接口(interface)的实例如下:

Agent agent = new XBProjector().io().stream(stream).read(Agent.class);

关于java - xstream 使用 Converter 将复杂的 XML 反序列化为更简单的 java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27605152/

相关文章:

java - 按指定模式在java中拆分字符串

java - spring 3.0 aop 切入点格式不正确 : expecting 'name pattern' error

regex - 匹配 XML 数据中的特定 CDATA 部分

java - 字符串replaceALL与匹配前后字母的条件

xml - 最好的 XSD 文件生成器

android - 获取标准布局属性

javascript - 如何解析从 jquery 作为响应文本接收到的 xml 数据

xml - 如何从 XML 元素中获取文本(结构标签)?

php - Simplexml 获取带有命名空间的属性

java logback 自定义记录器名称