2017-12-20 24 views
0

名前空間と読み込みXMLノードについては多くの投稿がありますが、特定のクエリに対する回答を見つけることができませんでした。私は自分のアプローチが正しいと信じていますが、私はそれが働くことを妨げている何かが明らかに欠けています。複数の名前空間を持つ子ノードを読む

概要 - XMLを返すWebサービスコールを作成しています。これをクリーンアップし、データテーブルを動的に作成してデータを取り込む必要があります。クリーンアップするには、複数の名前空間を含む返されたXMLから必要なノードを読み込もうとしています。

ドキュメントからデータを取得できますが、必要なレベルではデータを取得できません。 XMLContentノードリストに「Container」レベルのデータを格納させたい。

コード内のコメントは、私にデータを与える行を示していますが、必要なレベルではなく、次のレベルを返すと予想される行は表示されませんが、何も戻されません。私は必要なものを得ることに感謝私は別のレベルを下げる必要がありますが、これは、ノードリストがnullを返すポイントです。

XMLを最初に操作することなくデータセットまたはデータテーブルに読み込むことはできません。

サンプルXML

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:soap="namespaceone" xmlns:xsi="namespacetwo" xmlns:xsd="namespacethree"> 
    <soap:Body> 
     <Response xmlns="http://namespacefour"> 
      <Result> 
       <Data xmlns="http://namespacefive" xmlns:t="http://namespacesix"> 
        <Container> 
         <Properties> 
          <Property1>a</Property1> 
          <Property2>b</Property2> 
         </Properties> 
        </Container> 
        <Container> 
         <Properties> 
          <Property1>c</Property1> 
          <Property2>d</Property2> 
         </Properties> 
        </Container> 
       </Data> 
      </Result> 
     </Response> 
    </soap:Body> 
</soap:Envelope> 
 Dim XMLdoc As XmlDocument = New XmlDocument() 
     XMLdoc.LoadXml(strXML) 

     Dim XMLContent As XmlNodeList 

     Dim nsMgr As New XmlNamespaceManager(XMLdoc.NameTable()) 
     ns.AddNamespace("dflt", XMLdoc.DocumentElement.NamespaceURI) 
     ns.AddNamespace("ns1", XMLdoc.DocumentElement.GetNamespaceOfPrefix("soap")) 
     ns.AddNamespace("ns2", "http://namespacetwo") 
     ns.AddNamespace("ns3", "http://namespacethree") 
     ns.AddNamespace("ns4", "http://namespacefour") 
     ns.AddNamespace("ns5", "http://namespacefive") 
     ns.AddNamespace("ns6", "http://namespacesix") 

     'This returns content but not at the level I want 
     XMLContent = XMLdoc.SelectNodes("/ns1:Envelope/ns1:Body/ns4:Response/ns4:Result", nsMgr) 

     'This does not return anything 
     XMLContent = XMLdoc.SelectNodes("/ns1:Envelope/ns1:Body/ns4:Response/ns4:Result/ns5:Data", nsMgr) 

     If Not XMLContent Is Nothing Then 
      For Each node As XmlNode In XMLContent 
       'Create and populate table here 
      Next node 
     End If 

はあなたの助けに感謝します。

+0

XPATHを実行しているサンプル文書を投稿してください。また一般的な提案 - クエリをより一般的なものにして、異常なNSを気にしないようにしてください。 '//レスポンス/結果/データ ' – t1gor

+0

@ t1gorのサンプル文書に対する要求に同意します。テキストとして追加する必要があります。***イメージではありません***。 – kjhughes

+0

フェアポイントの人たち - イメージをXMLのコードサンプルに変更しました。より一般的なクエリを調査します。 –

答えて

0

は、最もエレガントな方法が、動作します:

//*[local-name(.) = 'Response']/*[local-name(.) = 'Result']/*[local-name(.) = 'Data']

はまた、NS-独立しています。 Testing link

希望に役立ちます。

0

提案をいただきありがとうございますが、私はそれを分解しました。外側のノードはエンコードされていませんが、XMLはデータノードからエンコードされていました。私はそれを見つけたはずだが、コード化されたものとそうでないものが混在するとは期待していなかった。とにかく、Webサービスの出力でHttpUtility.HtmlDecodeを実行すると、元々投稿したコードがうまく動作します。

関連する問題