2011-01-20 14 views
24

XML noob aquí! así que tengo algunos datos xml:Cómo leer XML en .NET?

<DataChunk> 
    <ResponseChunk> 
     <errors> 
      <error code=\"0\"> 
       Something happened here: Line 1, position 1. 
      </error> 
     </errors> 
    </ResponseChunk> 
</DataChunk> 

¿Cómo puedo obtener la lista de "errores" donde puedo conseguir el acceso al "código de error" y la descripción siguiente texto ...? Además, estoy usando .net4.0 en C# ... ¡gracias!

+1

Asumo esto: ' ' no es lo que el código XML en realidad parece? Esas barras la romperán, ¿es solo C# escapando lo que cortó y pegó? –

+0

@james Sí>. sringer

Respuesta

44

carga el XML en un XmlDocument y luego usar las consultas XPath para extraer los datos que necesita.

Por ejemplo

XmlDocument doc = new XmlDocument(); 
doc.LoadXml(xmlstring); 

XmlNode errorNode = doc.DocumentElement.SelectSingleNode("/DataChunk/ResponseChunk/Errors/error"); 

string errorCode = errorNode.Attributes["code"].Value; 
string errorMessage = errorNode.InnerText; 

En caso de riesgo para el XML que tiene múltiples elementos de error que puede utilizar para obtener una SelectNodesXmlNodeList que contiene todos los elementos en que XPath. Por ejemplo:

XmlDocument doc = new XmlDocument(); 
doc.LoadXml(xmlstring); 

XmlNodeList errorNodes = doc.DocumentElement.SelectNodes("/DataChunk/ResponseChunk/Errors/error"); 

foreach(XmlNode errorNode in errorNodes) 
{ 
    string errorCode = errorNode.Attributes["code"].Value; 
    string errorMessage = errorNode.InnerText; 
} 

Opción 2

Si usted tiene un esquema XML para el XML se podía unir el esquema a una clase (con la función xsd.exe .NET). Una vez que lo tenga, puede deserializar el XML en un objeto y trabajar con él desde ese objeto en lugar de hacerlo con el XML sin procesar. Este es un tema completo en sí mismo, así que si tiene el esquema, vale la pena investigarlo.

+0

Tiene 'SelectSingleNode', mientras que el OP quiere una lista de los nodos' error'. – Gabe

+0

@Gabe: Pero también tengo "Si existe la posibilidad de que el XML tenga múltiples elementos de error, puede usar SelectNodes para obtener un XmlNodeList que contenga todos los elementos en ese xpath". - Sin embargo, se agregó código de muestra para múltiples nodos de error. – MrEyes

+0

@joey: eso es lo que me pasa por la mitad de su publicación en SO media viendo la televisión desde el sofá :) – MrEyes

23

Puede utilizar Linq to XML:

var doc = XDocument.Parse(xml); 
var errors = from e in doc.Descendants("error") 
      select new 
      { 
       code = e.Attribute("code").Value, 
       msg = e.Value.Trim() 
      }; 

foreach (var e in errors) 
{ 
    // use e.code & e.msg 
} 

Si el XML de entrada es sin embargo muy grande , tal vez sería mejor que pasar por el documento con un XMLReader.

3
XmlReader xmlReader = XmlReader.Create(new StringReader(response)); 
     AmortizationCalculatorBE amortization = new AmortizationCalculatorBE(); 
List<PaymentCalculator> paymentList = new List<PaymentCalculator>(); 
     XmlDocument xmlDoc = new XmlDocument(); 
     xmlDoc.Load(new StringReader(response)); 
     XmlNodeList nodeList = xmlDoc.DocumentElement.SelectNodes("response/amortizationschedule/payment"); 
     XmlNodeList nodeList2 = xmlDoc.DocumentElement.SelectNodes("response"); 
     foreach (XmlNode node in nodeList) 
     { 
      PaymentCalculator payment = new PaymentCalculator(); 
      payment.beginningbalance = node.SelectSingleNode("beginningbalance").InnerText; 
      payment.principal = node.SelectSingleNode("principal").InnerText; 
      payment.interest = node.SelectSingleNode("interest").InnerText; 
      paymentList.Add(payment); 

     } 
     amortization._PaymentCalculator = paymentList; 
     foreach (XmlNode node in nodeList2) 
     { 
      amortization.totalprincipal = node.SelectSingleNode("totalprincipal").InnerText; 
      amortization.totalinterest = node.SelectSingleNode("totalinterest").InnerText; 

     }