Laden...

Verarbeitung von unterschiedlichen XML-Daten aus fremder Quelle

Erstellt von MorphieX vor 6 Jahren Letzter Beitrag vor 6 Jahren 1.354 Views
M
MorphieX Themenstarter:in
184 Beiträge seit 2012
vor 6 Jahren
Verarbeitung von unterschiedlichen XML-Daten aus fremder Quelle

Hallo zusammen,

ich weiß nicht genau ob ich den passenden Forenbereich gewählt habe. Wenn nicht dann bitte verschieben.

Ich programmiere mir gerade eine Anwendung, die mit unserer Alcatel-Telefonanlage kommunuziert und mich über Anrufe usw. informiert. Ich weiß, sowas ist eigentlich über TAPI / CAPI umzusetzen, allerdings unterstützt das unsere Telefonanlage in der aktuellen Lizensierung nicht.

Dafür hat die Telefonanlage aber eine API, die ich benutzen kann. Das läuft quasi so ab:

  1. Ich melde mich an der API (SOAP, WSDL) mit Benutzernamen und Passwort an und bekomme eine sessionID zurück.
  2. Ich kann der Telefonanlage dann sagen, dass ich mich gerne über alle Ereignisse informieren möchte (subscribe events), dazu muss ich eine URL angeben, die die Telefonanlage dann antriggert (habe ich über einen lokalen HTTPListener gelöst) und die von oben genannte sessionID, damit sie weiß für welchen Mitarbeiter das Events ausgelöst werden soll.
    Die Telefonanlage ruft dann die URL entsprechend auf und übermittelt im RequestBody entsprechende Informationen als XML. Je nachdem welche Informationen die Telefonanlage meldet, kann der XML-Aufbau komplett anders sein. Es gibt also eine hand voll Events, die immer an dieselbe URL übermittelt werden.

Meine Frage: Wie kann ich diese XML-Daten möglichst elegant auswerten? Natürlich könnte ich das XML irgendwie analyiseren und mich von node zu node bewegen, aber schöner fände ich es, wenn ich mir das irgendwie in eine Klasse deserialisieren könnte...
Leider ist das XML halt von Fall zu Fall unterschiedlich, so dass ich nicht sofort weiß in welche Klasse ich den Content deserialisieren könnte. Gibt es hier eine einfache Möglichkeit, die ich noch nicht kenne?

Also einmal sieht das XML z.B. so aus:

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <soapenv:Body>
  <ns1:onCallState soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="http://xmlapi.alcatel.com/phone">
   <sessionId xsi:type="xsd:string">0-1516180619</sessionId>
   <calls xsi:type="soapenc:Array" soapenc:arrayType="ns1:Call[1]" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
    <item>
     <callRef xsi:type="xsd:long">10836</callRef>
     <number xsi:type="xsd:string">123</number>
     <name xsi:type="xsd:string">Irgendein Mitarbeiter</name>
     <state xsi:type="ns1:CallState">ringingOutgoing</state>
     <correlator xsi:type="xsd:hexBinary" xsi:nil="true"/>
    </item>
   </calls>
  </ns1:onCallState>
 </soapenv:Body>
</soapenv:Envelope>

Oder mal so:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <soapenv:Body>
  <ns1:onNomadState soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="http://xmlapi.alcatel.com/phone">
   <sessionId xsi:type="xsd:string">0-1516180619</sessionId>
   <mode xsi:type="ns1:NomadMode">local</mode>
   <homeNumber xsi:type="xsd:string" xsi:nil="true"/>
  </ns1:onNomadState>
 </soapenv:Body>
</soapenv:Envelope>

Das Problem ist, dass die Telefonanlage für alle Events dieselbe URL aufruft.

Ist etwas schwierig zu erklären, aber vielleicht versteht es ja jemand 😉

16.835 Beiträge seit 2008
vor 6 Jahren

Nicht unüblich.

Im Endeffekt wirst Du eine Art Proxy-Klasse brauchen, die anhand einer Schema-Validierung prüft, um welches XML-Schema es sich handelt.
Anschließend kannst Du die Implementierung für das jeweilige Schema aufrufen.

M
MorphieX Themenstarter:in
184 Beiträge seit 2012
vor 6 Jahren

Okay, habe ich mir schon gedacht dass ich da händisch eine Unterscheidung machen muss...
Danke 😃