Подтвердить что ты не робот

Как читать XML в .NET?

XML noob здесь! Поэтому у меня есть некоторые XML-данные:

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

Как мне получить список "ошибок", где я могу получить доступ к "коду ошибки" и текстовому описанию следующего...? Кроме того, я использую .net4.0 в С#... спасибо!

4b9b3361

Ответ 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)
{

}