代码之家  ›  专栏  ›  技术社区  ›  Marcus Rigonati

XStream-在自定义转换器中生成类(解组)

  •  -1
  • Marcus Rigonati  · 技术社区  · 8 年前

    我正在编写一个Java应用程序并使用XStream,我需要自己完成整个解组,我可以编写代码来获得XML属性,但有一个问题:我不能接受其他类(代理)。

    我尝试了“reader.getValue()”,然后将XML放入设备标记中,但它不起作用。

    XML:

    <Device dev_id="99999">
        <Agent>
            <Name>PPPOOOLLL</Name>
            <Enable>1</Enable>
            <MAC>FF:FF:FF:FF:FF:FF</MAC>
            <IMEI/>
            <Addr>222.222.1.117</Addr>
            <LocalAddr>222.222.1.117</LocalAddr>
            <Port>80</Port>
            <LocalPort>80</LocalPort>
            <Username/>
            <Passwd/>
            <Mask>444.444.444.0</Mask>
            <GW>555.555.1.1</GW>
            <Model devtype_id="88">TTTYYYUUU2 3268</Model>
            <Incon incon_id="8">HWg PUSH via HTML</Incon>
            <LogPer>60</LogPer>
            <DatalogPer>3600</DatalogPer>
            <Push push_id="1">Default</Push>
            <Status>2</Status>
            <Alias>XXXYYYVVV</Alias>
            <Description/>
        </Agent>
    </Device>
    

    现在,我的代码是这样的,我不知道如何获得代理标记并将其转换为java类。

    public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
            DevicePai devicePai = new DevicePai();
            devicePai.setDev_id(reader.getAttribute("dev_id"));
            devicePai.setAgent( ??? );
            return devicePai;
        }
    

    我不能改变我编程的方式,也不能改变我使用的API,我需要进行解组。我的代码的其他方面都可以,我已经测试过了,但如果您有什么想法,我可能忘记了,请告诉我,我会尽快检查。:)

    1 回复  |  直到 8 年前
        1
  •  1
  •   Marcus Rigonati    8 年前

    资料来源: http://x-stream.github.io/converter-tutorial.html#ComplexConverter
    我可以通过做 moveDown() moveUp() . 我明白了当你使用 向下移动() ,对象将光标移动到下一个 非读取 孩子,所以我要做的是做一个循环,尽可能多地上下移动标记代理。我的代码现在是:

    public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
    
        DevicePai devicePai = new DevicePai();
        devicePai.setDev_id(reader.getAttribute("dev_id"));
    
        reader.moveDown();
        Agent agent = new Agent();
        while (reader.hasMoreChildren()) {
            reader.moveDown();
            agentFieldContructor(agent, reader.getNodeName(), reader.getValue());
            reader.moveUp();
        }
    
        devicePai.setAgent(agent);
        reader.moveUp();
    


    agentFieldConstructor() 是一种向代理添加指定字段传递参数的方法,它只是一个开关盒块。

    2017年12月14日更新:
    第二个更好的答案。我可以告诉XStream自动转换代理标记,所以我取“dev\u id”,然后,我需要做的就是调用“context”:
    Agent newAgent = (Agent) context.convertAnother(devicePai, Agent.class);
    现在我需要设置设备属性:
    devicePai.setAgent(newAgent);
    没有任何手动操作,我的解组方法最终是这样的:

    public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
    
        DevicePai devicePai = new DevicePai();
        devicePai.setDev_id(reader.getAttribute("dev_id");
    
        reader.moveDown();
        Agent newAgent = (Agent) context.convertAnother(devicePai, Agent.class));
        devicePai.setAgent(newAgent);
        reader.moveUp();
    
        return devicePai;
    
    }