Kobarin's Development Blog

C#やASP.NET、公開APIなどについての記録です。

C#で、NameSpace(名前空間)が指定されたXMLの読み込み

C#でNameSpaceの指定されたXMLの読み込み方法。
楽天トラベルのAPIを使って例示してみよう。

XML(一部省略)

  
    
      true
      true
      true
      省略
    
    Success
    
  
  
    
      
        1
        1
        1
        1
        1
      
      
        
          
            99999
            サンプルホテル
            省略
          
        
        省略
      
    
  

readxml.aspx.cs
protected void Page_Load(object sender, EventArgs e) {
  using (WebClient client = new WebClient()) {
    client.Encoding = System.Text.Encoding.UTF8;
    strXml = client.DownloadString(ApiUrl);
  }

  XmlDocument doc = new XmlDocument();
 
  XmlNamespaceManager xnm = new XmlNamespaceManager(doc.NameTable);
  xnm.AddNamespace("header", "http://api.rakuten.co.jp/rws/rest/Header");
  xnm.AddNamespace("vacantHotelSearch", "http://api.rakuten.co.jp/rws/rest/VacantHotelSearch/2009-10-20");
  
  doc.LoadXml(strXml);
  doc.PreserveWhitespace = false;

  //成功の可否を取得
  string strSuccess = doc.SelectSingleNode("Response/header:Header/Status", xnm).InnerText;
  if (strSuccess != "Success") return;

  XmlNode nodeRoot = doc.SelectSingleNode("Response/Body/vacantHotelSearch:VacantHotelSearch", xnm);

  XmlNodeList nodes = nodeRoot.SelectNodes("hotel/roomInfo");
  // でループ
  foreach (XmlNode node in nodes){
    XmlNode rnode = node.SelectSingleNode("roomBasicInfo");
    string _pname = rnode.SelectSingleNode("planName").InnerText;
    string _rname = rnode.SelectSingleNode("roomName").InnerText;

    XmlNode cnode = node.SelectSingleNode("dailyCharge");
    string _sdate = cnode.SelectSingleNode("stayDate").InnerText;
    string _charge = cnode.SelectSingleNode("rakutenCharge").InnerText;
    
    lblResult.Text += String.Format("<br />プラン名:{0} 部屋名:{1} 宿泊日:{2} 料金:{3}"
      , _pname, rname, _sdate, _charge);
  }
}