XStream - 在自定义转换器中创建一个 class(解组)

XStream - Make a class in custom converter (unmarshal)

我正在编写 Java 应用程序并使用 XStream,我需要自己制作整个 Unmarshal,我可以编写代码来获取 XML 属性,但是有一个问题:我不能带另一个 class (Agent).

我试过"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 class.

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

我无法更改我对此进行编程的方式,也无法更改我正在使用的 API,我需要解组。我的代码的每个其他方面都没有问题,我测试过,但如果你有什么想法我可能忘记了,请告诉我,我会尽快检查。 :)

来源:http://x-stream.github.io/converter-tutorial.html#ComplexConverter
我可以通过 moveDown()moveUp() 获取 class 的每个属性。我了解到,当您使用 moveDown() 时,对象会将光标移动到下一个 非读取 子级,所以我要做的就是循环移动到 moveDown 和在标签代理允许的范围内向上移动。我的代码现在是:

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()是给代理添加指定字段传递参数的方法,它只是一个switch-case块。

2017 年 12 月 14 日更新:
第二个更好的答案。我可以告诉 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;

}