2012-03-05 3 views
2

У меня есть объект XMLDocument, в котором InnerXml задает ответ, который я получаю из веб-службы. Ответ пример, как это:ASP.Net - Анализ XML

<GetAddressResponse> 
    <AddressStatus>EXACT MATCH</AddressStatus> 
    <DefaultAddress> 
     <FirmName></FirmName> 
     <Address1></Address1> 
     <Address2>PO BOX 123</Address2> 
     <City>DAYTON</City> 
     <State>OH</State> 
     <Urbanization></Urbanization> 
     <Zip5>45475</Zip5> 
     <Zip4>1952</Zip4> 
     <CarrierRoute>B017</CarrierRoute> 
     <CountyName>MONTGOMERY</CountyName> 
     <DeliveryPoint>52</DeliveryPoint> 
    </DefaultAddress> 
    <AddressRecCount>0</AddressRecCount> 
</GetAddressResponse> 

Мне нужно, чтобы иметь возможность получить первое и проверить значение AddressStatus и на основе результата, получить все под DefaultAddress. Я использую .Net3.5, поэтому я могу использовать Linq, если это необходимо. Заранее спасибо.

ответ

3

Вы можете попробовать этот способ ..

string xml = @"<GetAddressResponse> 
          <AddressStatus>EXACT MATCH</AddressStatus> 
          <DefaultAddress> 
           <FirmName></FirmName> 
           <Address1></Address1> 
           <Address2>PO BOX 123</Address2> 
           <City>DAYTON</City> 
           <State>OH</State> 
           <Urbanization></Urbanization> 
           <Zip5>45475</Zip5> 
           <Zip4>1952</Zip4> 
           <CarrierRoute>B017</CarrierRoute> 
           <CountyName>MONTGOMERY</CountyName> 
           <DeliveryPoint>52</DeliveryPoint> 
          </DefaultAddress> 
          <AddressRecCount>0</AddressRecCount> 
         </GetAddressResponse> 
         "; 
      XmlDocument doc = new XmlDocument(); 
      doc.LoadXml(xml); 

      XmlNode node = doc.SelectSingleNode("GetAddressResponse/AddressStatus"); 

      if (node != null) 
      { 
       string addStatus = node.InnerText.Trim(); 

       if (addStatus.ToUpper() == "EXACT MATCH") 
       { 
        XmlNode addNode = doc.SelectSingleNode("GetAddressResponse/DefaultAddress"); 

        foreach (XmlElement ele in addNode.ChildNodes) 
        { 
         //get each child element value 
         string val = ele.InnerText; 
        } 

       } 
      } 
+0

Спасибо. Можно ли выбрать, какой элемент я хочу сохранить? Например, если мне не важно <Урбанизация> и просто хочу сохранить Address2, City, State в объекте AddressInfo. – NoBullMan

+0

Я использовал это для получения полей, которые мне нужны: 'var AddressInfoList = doc.Descendants (« GetAddressResponse »). Потомки (« DefaultAddress »). Выберите (Address => new {Address = Address.Element (« Address2 »). Value, City = Address.Element («Город»). Value, State = Address.Element («State»). Значение, Zip5 = Address.Element («Zip5»). Значение, Zip4 = Address.Element («Zip4»)) .Value, DPC = Address.Element («DeliveryPoint»). Value,}). ToList(); foreach (var AddressInfo в AddressInfoList) {' – NoBullMan

+0

Вы можете использовать тот же метод SelectSingleNode, pleae проверить другой пример .. в ответ –

0

// для выбора одного узла ..

if (node != null) 
      { 
       string addStatus = node.InnerText.Trim(); 

       if (addStatus.ToUpper() == "EXACT MATCH") 
       { 
        XmlNode addNode = doc.SelectSingleNode("GetAddressResponse/DefaultAddress"); 

        //only Zip5 is selected if exists 
        XmlNode childNode = addNode.SelectSingleNode("Zip5"); 

        if (childNode != null) { string zip = childNode.InnerText; } 

        //select city 
        childNode = addNode.SelectSingleNode("City"); 
        if (childNode != null) { string city = childNode.InnerText; } 

        //etc 

       } 
      }