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

时间:2014-12-22 14:58:45

标签: java xml xml-parsing xstream

我肯定是了解Xstream转换器的问题。

我有一个非常复杂的XML来自传统的后台应用程序,只是想将这个转换为更简单的java类或带转换器的Map。

  1. 我不想编组XML,只需要解组
  2. 我不想使用注释,只需KISS
  3. 我的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类。

1 个答案:

答案 0 :(得分:1)

似乎您希望xml结构不会反映在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();

}

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

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