XML noob here! J'ai donc quelques données XML:
<DataChunk>
<ResponseChunk>
<errors>
<error code=\"0\">
Something happened here: Line 1, position 1.
</error>
</errors>
</ResponseChunk>
</DataChunk>
Comment puis-je obtenir la liste des "erreurs" où je peux avoir accès au "code d'erreur" et à la description textuelle suivante ...? De plus, j'utilise .net4.0 en c # ... merci!
Chargez le XML dans une XmlDocument
, puis utilisez des requêtes xpath pour extraire les données dont vous avez besoin.
Par exemple
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;
S'il existe un risque que le XML ait plusieurs éléments d'erreur, vous pouvez utiliser SelectNodes
pour obtenir un XmlNodeList
qui contient tous les éléments de ce xpath. Par exemple:
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;
}
Option 2
Si vous disposez d'un schéma XML pour le fichier XML, vous pouvez le lier à une classe (à l'aide de l'outil .NET xsd.exe). Une fois que vous avez cela, vous pouvez désérialiser le XML en un objet et le manipuler à partir de cet objet plutôt que du XML brut. C'est un sujet entier en lui-même, donc si vous avez le schéma, cela vaut la peine de l'examiner.
Vous pouvez utiliser 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 votre XML d'entrée est très gros, il serait peut-être préférable de parcourir le document avec un XMLReader
.
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;
}
en utilisant SelectNodes
avec Cast
à IEnumerable<XmlElement>
collection de types. alors vous pouvez essayer d'utiliser linq
pour obtenir votre valeur.
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml_str);
var errors = doc
.SelectNodes("/DataChunk/ResponseChunk/Errors/error")
.Cast<XmlElement>()
.Select(x => new {
errorCode = x.Attributes["code"].Value,
errorMessage = x.InnerText
});
foreach (var item in errors)
{
}