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;
}
我正在编写 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;
}