Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
xstream使用转换器将复杂XML非序列化为更简单的java_Java_Xml_Xml Parsing_Xstream - Fatal编程技术网

xstream使用转换器将复杂XML非序列化为更简单的java

xstream使用转换器将复杂XML非序列化为更简单的java,java,xml,xml-parsing,xstream,Java,Xml,Xml Parsing,Xstream,我对Xstream转换器的理解肯定有问题 public class ResultConverter implements Converter { ... public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) { Map<String, Object> agents = new HashMap<String, Object>(

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

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;
}
我有一个非常复杂的XML来自遗留的后台应用程序,我只想将它转换成一个更简单的java类或带有转换器的映射

  • 我不想封送到XML,只想取消封送
  • 我不想用注解,只是亲吻
  • 我的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>
    
    我不明白如何下台,转而支持另一个转换器

    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;
    }
    
    公共类ResultConverter实现转换器{
    ...
    公共对象解组(HierarchycalStreamReader,
    解组(上下文){
    映射代理=新的HashMap();
    while(reader.hasMoreChildren()){
    reader.moveDown();
    //我该怎么做才能退下来支持代理转换器?
    reader.moveUp();
    }
    退货代理;
    }
    
    我没有看到Xstream滚动dow thierarchy来激活我的代理转换器

    我肯定没有抓住要点

    编辑

    Xstream可能不是用于此目的的正确工具。 根据Cfx advise,我会使用xmlbeam。
    XMLBeam根据XPATH映射将XML投影到Java类。

    似乎您不希望XML结构反映在Java类中。如果您坚持使用XStream,我没有解决方案。但有一个解决方案正好解决了这个问题。它使用注释,但IMHO没有违反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);
    

    回答得好。你说得对,这可能是解决我问题的正确方法。我试试看。谢谢但是我必须使用中间接口来支持项目列表吗?作为公共接口代理列表{@XBRead(“/root/agent”)公共列表getAgents();}是的,但您可能会使用一个技巧:重用代理接口并将getAgents()方法仅添加到代理接口本身。这不是简单的OO,但效果很好。听到这个消息我很高兴。谢谢你尝试一下。请随时联系我(通过github或项目站点)以获得进一步的支持。还有更多,例如动态投影或通过XPath创建XML。
    Agent agent = new XBProjector().io().stream(stream).read(Agent.class);