2009-05-06 15 views
1

SOAP Webサービスからの応答を解析しようとしていますが、データの一部に無効なxmlns要素があり、問題の原因になっていると思います。Delphi - IXMLNodeの無効なネームスペースURI

私が作業している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> 

石鹸でのxmlns URI:ボディノードはOKで、無効であるResponseDataにおけるその1は、それがどれも存在しない文書を指します。 Webサービスは、私のコントロール下ので、これは問題外である:(固定ではないことに留意すべきである。

現時点での私のデルファイ(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を返します。

問題は次の検索ノード(ChildNodes.FindNode('ResponseDataResult',''))は、l_tmpのChildNodesにアクセスしようとするとアクセス違反が発生します。 l_tmp.xmlと私が期待するXMLであることを確認してください。

名前空間が不足していると思われますので、削除しようとしましたが、読み取り専用の属性であるというエラーが表示されます。

NSに関係なくxmlns属性を削除するかノードを選択する必要はありますか?または私はこの間違っているつもりですか?

答えて

2

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

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

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

2引数バージョンは、名前空間を必要とし、あなたは空の文字列を指定すると、それはあなたが空の名前空間を持っているノードだけを要求していることを意味します。あなたは明らかに名前空間が何であるかを知っているので、body要素を取得するのと同じように、引数の2つのバージョンをとにかく呼び出すことができます:

l_tmp := FSOAPBody.ChildNodes.FindNode('ResponseData', 
      'http://www.example.com/WebServices/Schemas/1'); 
関連する問題