SOAP Web サービスからの応答を解析しようとしていますが、データの一部に無効な xmlns 要素が含まれており、それが問題を引き起こしていると思います。
私が取り組んでいる XML の部分は次のとおりです。
<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>
soap:Body ノードの xmlns URI は問題ありません。ResponseData の URI は無効です。存在しないドキュメントを指しています。Web サービスは私の管理下にないため、これを修正することは問題外であることに注意してください :(.
私の Delphi (2007) コードの外観は、現在、このようなものです。
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;
上記のコードでは、空白の名前空間の URL をFindNode('ResponseData','')
コードに追加する必要がありました。何も検索されず、nil が返されますが、期待される XML が返されます。
問題は、l_tmp の ChildNodes にアクセスしようとすると、次の検索ノード ( ChildNodes.FindNode('ResponseDataResult','')
) でアクセス違反が発生することです。l_tmp.xml を使用して xml を調べ、それが期待どおりの XML であることを確認できます。
名前空間が見つからないことが原因であると思われるため、削除しようとしましたが、読み取り専用属性であるというエラーがさらに表示されます。
NSに関係なく、xmlns属性を削除したり、ノードを選択したりする方法はありますか? それとも私はこれについて間違っていますか?