XStream - 在自定义转换器(unmarshal)中创建一个类

时间:2017-12-07 20:01:10

标签: java api xstream

我正在编写Java应用程序并使用XStream,我需要自己完成整个Unmarshal,我可以使代码获得XML属性但是有一个问题:我无法接受另一类(代理人)。

我试过" reader.getValue()"然后将XML带入Device标签,但它确实无效。

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>

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

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

我无法改变我编程的方式,也无法改变我使用的API,我需要制作unmarshal。我的代码的其他方面都还可以,我测试了,但如果你有一些想法,我可能已经忘了,请告诉我,我会尽快检查。 :)

1 个答案:

答案 0 :(得分:1)

来源:http://x-stream.github.io/converter-tutorial.html#ComplexConverter
我可以通过moveDown()moveUp()来获取班级的每个属性。我已经了解到,当你使用moveDown()时,对象会将光标移动到下一个非读取子节点,所以我要做的就是将一个循环移到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()是一个metod,它通过参数向代理添加指定的字段,它只是一个switch-case块。

立即更新12/14/2017:
第二个更好的答案。我可以告诉XStream自动转换Agent标签,所以我采用“dev_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;

}