Hallo Leute,
gegeben sei folgendes
XML-Dokument:
XML-Code:
<?
xml version="1.0" encoding="utf-8"?>
<s:Envelope
xmlns:s="http://schemas.xmlsoap.org/
soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/
soap/encoding/">
<s:Body>
<u:GetCommonLinkPropertiesResponse
xmlns:u="urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1">
<NewWANAccessType>DSL</NewWANAccessType>
<NewLayer1UpstreamMaxBitRate>0</NewLayer1UpstreamMaxBitRate>
<NewLayer1DownstreamMaxBitRate>0</NewLayer1DownstreamMaxBitRate>
<NewPhysicalLinkStatus>Down</NewPhysicalLinkStatus>
</u:GetCommonLinkPropertiesResponse>
</s:Body>
</s:Envelope>
Es gibt noch andere
XML-Dokumente, die analog zu diesem aufgebaut sind - Rückgabe einer Fritzbox eben
.
Da ich mit
XML bisher nur am Rande zu tun hatte, aber noch nie in Verbindung mit Delphi, habe ich nach nun anderthalb Tagen endlich funktionierenden Code zusammen, um an die Inhalte des Knotens NewWANAccessType und dessen Siblings zu kommen:
Delphi-Quellcode:
var
LXMLDoc: IXMLDocument;
LNode: IXMLNode;
begin
[...]
if Assigned(LXMLDoc) then begin
LNode:= LXMLDoc.DocumentElement.ChildNodes[0].ChildNodes.FindNode('u:GetCommonLinkPropertiesResponse', '');
if Assigned(LNode) then begin
FConfigDSL.WANAccessType:= LNode.ChildNodes.FindNode('NewWANAccessType', '').Text;
FConfigDSL.UpstreamMaxBR:= LNode.ChildNodes.FindNode('NewLayer1UpstreamMaxBitRate', '').Text;
[...]
LNode:= nil;
end;
LXMLDoc:= nil;
end;
end;
Problematisch war für mich die automatische Namespace-Geschichte, die die Unterknoten nicht haben - ein Hinweis
bei StackOverflow brachte mich auf die richtige Fährte. Geht das schöner oder einfacher? Ich hab den Code zwar in eine Methode ausgelagert, der man mehr oder weniger nur noch die Knotennamen übergeben muss (nicht in obigem Code), aber ich denke mir, dass das auch besser gehen müsste.
Danke erstmal.
Grüße
Dalai