2017-04-25 10 views
1

以下のWeb API XMLレスポンスから "cust_name"と "code"ノードを取得しようとしています。C#のXML文字列から特定のノードを取得する方法

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<cust_list xmlns="http://example.com"> 
    <cust> 
     <cust_id>1234</cust_id> 
     <cust_name>abcd</cust_name> 
     <cust_type> 
      <code>2006</code> 
     </cust_type> 
    </cust> 
</cust_list> 

レスポンスをXMLDocumentに文字列として書き込み、そこから読み取ろうとしています。以下は私のコード

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://serviceURI"); 
request.Method = "GET"; 
request.ContentType = "Application/XML"; 

HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 

using (var reader = new StreamReader(response.GetResponseStream())) 
{ 
    string responseValue = reader.ReadToEnd(); 
    var doc = new XmlDocument(); 
    doc.LoadXml(responseValue); 

    string node = doc.SelectSingleNode("/cust_list/cust/cust_name").InnerText; 
    string node2 = doc.SelectSingleNode("/cust_list/cust/cust_type/code").InnerText; 
} 

私は特定のノードをターゲットにしようとしているが、取得エラー「オブジェクト参照がオブジェクトのインスタンスに設定されていません」です。私はここで間違って何をしていますか?この例では

+1

これが原因名前空間の一部にほぼ確実です。 LINQ to XMLを使用したくない理由があれば、名前空間の扱いが簡単になります。 –

+0

ここに答えです:http://stackoverflow.com/a/4171468/126995 – Soonts

+0

[XmlDocument.SelectSingleNodeとxmlNamespaceの問題の可能な複製](http://stackoverflow.com/questions/4171451/xmldocument-selectsinglenode-and-xmlnamespace -issue) – Soonts

答えて

2
XElement xml = XElement.Parse(xmlString); 
XNamespace ns = (string)xml.Attribute("xmlns"); 
var customers = xml.Elements(ns + "cust") 
    .Select(c => new 
    { 
     name = (string)c.Element(ns + "cust_name"), 
     code = (int)c.Element(ns + "cust_type") 
      .Element(ns + "code") 
    }); 

XElementは、入力文字列から解析されます。

Namespaceも属性xmlnsを使用して作成されます。要素の選択時にどのように使用されるかに注意してください。

ルート要素のすべてのcust要素が選択され、現在stringという名前とintのコードが宣言されている新しい匿名型に投影されます(これは必要に応じて拡張できます)。

したがって、たとえば、あなたが次のことを行うことができます最初の顧客の名前を取得します

string name = customers.First().name; 
+0

答えをありがとう!それはうまくいった。私は "First()。value"を "string name = customers.First()。name.First()。Value"の最後に追加する必要がありました。実際のinnerXML値を返します。 –

関連する問題