2017-12-07 1 views
-1

Ich programmiere eine Java-Anwendung und mit XStream, ich muss die gesamte Unmarshal auf eigene Faust machen, könnte ich den Code machen, um die XML-Eigenschaften zu bekommen, aber es gibt eine Problem: Ich kann die andere Klasse (Agent) nicht nehmen.XStream - Machen Sie eine Klasse in benutzerdefinierten Konverter (unmarshal)

Ich habe "reader.getValue()" ausprobiert und dann die XML in das Device-Tag übernommen, aber es funktioniert nicht.

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> 

Nun, mein Code so ist, und ich weiß nicht, wie ich den Agent-Tag bekommen konnte und es in eine Java-Klasse verwandeln.

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

ich nicht ändern kann ich diese Programmierung bin noch die API Ich verwende, brauche ich die Abstellungs zu machen. Jeder andere Aspekt meines Codes ist in Ordnung, ich habe getestet, aber wenn Sie etwas im Sinn haben, habe ich vielleicht vergessen, bitte sagen Sie mir, und ich werde so schnell wie möglich überprüfen. :)

+0

Dies ist die XStream Version ich verwende: ' \t \t \t xs tream \t \t \t xstream \t \t \t 1.1.2 \t \t \t \t \t \t \t xpp3 \t \t \t xpp3 \t \t \t 1.1.4c \t \t ' –

+0

Haben Sie http://x-stream.github.io/converter-tutorial.html#ComplexConverter gelesen? –

+0

Vielen Dank !! Können Sie mit diesem Link eine Antwort geben? Also kann ich dir meine Stimme geben! –

Antwort

1

Quelle: http://x-stream.github.io/converter-tutorial.html#ComplexConverter
ich jedes Attribut meiner Klasse nehmen könnte durch moveDown() und moveUp() tun. Ich habe gelernt, dass, wenn Sie moveDown() verwenden, das Objekt den Cursor auf die nächste nicht gelesen child bewegt, was ich tun musste, war eine Schleife zu moveDown und moveUp so viele wie der Tag-Agent ermöglicht. mein Code ist jetzt:

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() ist ein metod, die das angegebene Feld durch Parameter übergeben, es ist nur ein switch-case-Block Agent hinzufügen.

Update 12/14/2017:
Eine zweite und bessere Antwort. Ich kann den Agent-Tag sagen Xstream automatcly konvertieren, so nehme ich „dev_id“ und nach alles, was ich tun müssen, um Anruf „Kontext“:
Agent newAgent = (Agent) context.convertAnother(devicePai, Agent.class);
Und jetzt habe ich das Gerät Attribut festlegen müssen:
devicePai.setAgent(newAgent);
Nichts wurde händisch gemacht, und meine Abstellungs Methode Endup wie folgt aus:

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; 

} 
Verwandte Themen