Question

J'essaie d'analyser la réponse d'un service Web SOAP, mais une partie des données contient un élément xmlns non valide et je pense que cela ne me pose pas de gros problèmes.

La partie du code XML avec laquelle je travaille est la suivante.

<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>

L'URI xmlns dans le noeud soap: Body est OK, c'est celui de ResponseData qui est invalide, il pointe vers un document inexistant. Il convient de noter que le service Web n’est pas sous mon contrôle. Il est donc hors de question de résoudre ce problème: (.

Mon code Delphi (2007) ressemble actuellement à ceci:

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;

Dans le code ci-dessus, j'ai dû ajouter l'URL d'espace de nom vide au code FindNode ('ResponseData', '') , sans quoi, il ne trouvera rien et retournera nil, avec cela cependant, il récupère le XML attendu.

Le problème est que le prochain noeud de recherche ( ChildNodes.FindNode ('ResponseDataResult', '') ) déclenche une violation d'accès lors d'une tentative d'accès aux ChildNodes de l_tmp, je peux consulter le xml. en utilisant l_tmp.xml et voyez que c’est le XML que j’attendrais.

Je soupçonne que cela est dû à l'espace de nom manquant. J'ai donc essayé de le supprimer, mais je reçois davantage d'erreurs indiquant qu'il s'agit d'un attribut en lecture seule.

Est-il possible de supprimer l'attribut xmlns ou de sélectionner des nœuds indépendamment de leur NS? ou est-ce que j'y vais mal?

Était-ce utile?

La solution

Il n’est pas pas attendu que tous les URI d’espace de nommage fassent référence aux ressources réelles. Ils sont principalement utilisés comme identificateurs uniques afin que XML provenant de plusieurs sources puisse utiliser les mêmes noms sans interférer les uns avec les autres. Ils ne sont pas obligés de pointer vers le schéma qui décrit l'élément valide et les valeurs d'attribut pour l'espace de noms; XML ne nécessite même pas l’existence d’un tel schéma.

Si vous souhaitez rechercher des éléments sans tenir compte de l'espace de nom, appelez la version à un argument de FindNode .

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

La version à deux arguments nécessite un espace de noms. Lorsque vous spécifiez une chaîne vide, cela signifie que vous ne demandez que des nœuds contenant des espaces de noms vides. Puisque vous savez apparemment ce qu'est l'espace de noms, vous pouvez quand même appeler la version à deux arguments, tout comme vous l'avez utilisée pour obtenir l'élément body:

l_tmp := FSOAPBody.ChildNodes.FindNode('ResponseData',
           'http://www.example.com/WebServices/Schemas/1');
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top