我正在编写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。我的代码的其他方面都还可以,我测试了,但如果你有一些想法,我可能已经忘了,请告诉我,我会尽快检查。 :)
答案 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;
}