1

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属性を削除したり、ノードを選択したりする方法はありますか? それとも私はこれについて間違っていますか?

4

1 に答える 1

2

すべての名前空間 URI が実際のリソースを参照しているとは限りません。これらは主に一意の識別子として使用されるため、複数のソースからの XML が互いに干渉することなく同じ名前を使用できます。名前空間の有効な要素と属性値を記述するスキーマを指す必要はありません。XML では、そのようなスキーマが存在する必要さえありません。

名前空間に関係なく要素を検索する場合は、引数が 1 つのバージョンの を呼び出しますFindNode

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

引数が 2 つのバージョンには名前空間が必要です。空の文字列を指定すると、空の名前空間を持つノードのみを要求していることになります。どうやら名前空間が何であるかを知っているので、ボディ要素を取得するために使用したのと同じように、2 つの引数のバージョンを呼び出すことができます。

l_tmp := FSOAPBody.ChildNodes.FindNode('ResponseData',
           'http://www.example.com/WebServices/Schemas/1');
于 2009-05-06T14:10:33.147 に答える