Frage

Ich versuche, eine Antwort von einem SOAP-Web-Service zu analysieren, aber ein Teil der Daten hat ein ungültiges Element xmlns und ich denke, es ist mir kein Ende der Probleme verursacht.

Der Teil des XML, das ich arbeite mit ist wie folgt.

<soap:Body xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <ResponseData xmlns="http://www.example.com/WebServices/Schemas/1">
        <ResponseDataResult>
            <Messages xmlns="http://www.example.com/WebServices/Schemas/2">
                <Message>...</Message>
            </Messages>
        </ResponseDataResult>
        ...
    </ResponseData>
</soap:Body>

Die Xmlns URI in der Seife: Body-Knoten ist in Ordnung, es ist das ein in den Response ungültig ist, verweist er auf ein nicht vorhandenes Dokument. Es sollte angemerkt werden, dass der Web-Service nicht unter meiner Kontrolle ist so diese Festsetzung indiskutabel ist. (

meine Delphi (2007) Code aussehen, derzeit so etwas wie diese.

var l_tmp,l_tmp2,FSOAPBody:IXMLNode;

begin
    ...

    FSOAPBody := FSOAPEnvelope.ChildNodes.FindNode('Body','http://schemas.xmlsoap.org/soap/envelope/');
    //returns the xml above.
    if (FSOAPBody = nil) then exit;

    l_tmp := FSOAPBody.ChildNodes.FindNode('ResponseData','');
    if (l_tmp = nil) or (not l_tmp.HasChildNodes) then exit;

    l_tmp2 := l_tmp.ChildNodes.FindNode('ResponseDataResult','');

    ...
end;

In dem obigen Code, ich hatte die leere Namespace URL zum FindNode('ResponseData','') Code hinzufügen, wie mit heraus, es wird es nichts zu finden, und gibt nil zurück, mit er jedoch reutrns es die erwarteten XML.

Das Problem ist, dass der nächste Fund Knoten (ChildNodes.FindNode('ResponseDataResult','')) löst eine Zugriffsverletzung, wenn die Childnodes von l_tmp zuzugreifen versuchen, ich auf die Verwendung von XML l_tmp.xml schauen und sehen, dass es die XML ist, würde ich erwarten.

Ich vermute, dass es an den fehlenden Namensraum zurückzuführen ist, so habe ich versucht, es zu entfernen, aber mehr Fehler bekommen sagen, es ist ein read-only-Attribut.

Gibt es trotzdem die xmlns entfernen Attribut oder Knoten auswählen, unabhängig von dort NS? oder bin ich über diese falsch gehen?

War es hilfreich?

Lösung

Es ist nicht erwartet , dass alle Namespace-URIs tatsächlichen Ressourcen beziehen. Sie werden in erster Linie als eindeutige Kennungen so XML-Daten aus mehreren Quellen verwendet, die gleichen Namen verwenden können, ohne sie zu stören. Sie sind nicht auf das Schema Punkt erforderlich, dass das gültige Element und Attributwerte für den Namespace beschreibt; XML ist nicht einmal erforderlich, dass ein solches Schema vorhanden sind.

Wenn Sie Elemente ohne Rücksicht auf Namensraum suchen möchten, dann rufen Sie die einargumentigen Version von FindNode.

l_tmp := FSOAPBody.ChildNodes.FindNode('ResponseData');

Die zweiargumentigen Version erfordert einen Namespace, und wenn Sie einen leeren String angeben, bedeutet das Sie anfordern nur Knoten, die leeren Namensräumen haben. Da Sie offenbar wissen, was der Namespace ist, könnten Sie die zweiargumentigen Version sowieso nennen, so wie du es verwendet, um das Körperelement zu erhalten:

l_tmp := FSOAPBody.ChildNodes.FindNode('ResponseData',
           'http://www.example.com/WebServices/Schemas/1');
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top