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:
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 😉
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Okay, habe ich mir schon gedacht dass ich da händisch eine Unterscheidung machen muss...
Danke 😃