Как читать XML в .NET?
XML noob здесь!
Поэтому у меня есть некоторые XML-данные:
<DataChunk>
<ResponseChunk>
<errors>
<error code=\"0\">
Something happened here: Line 1, position 1.
</error>
</errors>
</ResponseChunk>
</DataChunk>
Как мне получить список "ошибок", где я могу получить доступ к "коду ошибки" и текстовому описанию следующего...?
Кроме того, я использую .net4.0 в С#... спасибо!
Ответы
Ответ 1
Загрузите XML в XmlDocument
, а затем используйте запросы xpath для извлечения необходимых данных.
Например
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;
Если существует вероятность того, что XML имеет несколько элементов ошибки, вы можете использовать SelectNodes
для получения XmlNodeList
, который содержит все элементы в этом xpath. Например:
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;
}
Вариант 2
Если у вас есть XML-схема для XML, вы можете привязать схему к классу (используя инструмент .NET xsd.exe). После этого вы можете десериализовать XML в объект и работать с ним с этого объекта, а не с необработанным XML. Это целая тема сама по себе, поэтому, если у вас есть схема, на которую стоит обратить внимание.
Ответ 2
Вы можете использовать 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
}
Если ваш входной XML очень велик, лучше просмотреть документ с помощью 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;
}
Ответ 4
использование SelectNodes
с коллекцией типов Cast
to IEnumerable<XmlElement>
. тогда вы можете попытаться использовать linq
чтобы получить ваше значение.
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)
{
}
Ответ 5
Если вы читаете большой XML файл и нуждаетесь в более быстром/более производительном параметре, см.: XmlReader - Каков наилучший способ анализа (большого) XML-кода в коде С#?