Чтение значений атрибутов с помощью XmlReader

У меня есть файл XML, из которого я пытаюсь прочитатьВоти иметь следующий код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.IO;

namespace XML
{
    class Program
    {
        static void Main(string[] args)
        {
            XmlTextReader textReader = new XmlTextReader("secLendingXML.cfm.xml");
            while (textReader.Read())
            {
                switch (textReader.NodeType)
                {
                    case XmlNodeType.Element:
                        Console.WriteLine(textReader.Name);
                        Console.WriteLine(textReader.Value);
                        break;
                    case XmlNodeType.Text:
                        Console.WriteLine(textReader.Value);
                        break;
                    case XmlNodeType.XmlDeclaration:
                    case XmlNodeType.ProcessingInstruction:
                        Console.WriteLine(textReader.Name + " " + textReader.Value);
                        break;
                    case XmlNodeType.Comment:
                        Console.WriteLine(textReader.Value);
                        break;
                    case XmlNodeType.EndElement:
                        break;
                }
            }
            Console.ReadLine();
        }
    }
}

Код работает правильно в том смысле, что он читает узлы и возвращает имена. Но проблема в том, что я пытаюсь также извлечь данные в узлах. Другими словами, когда он читает первый раздел после тестового раздела, он будет читать:

slnc:DataSet
slnc:Group
slnc:Section
slnc:ActualAvailableToBorrow
*** here ***
slnc:oustandingLoans

Вот где я хочу, чтобы программа чтения текста читала следующие значения в узле, как confidentiality="F", currency="USD"и т. д., но он просто пропускает прямо к следующий раздел без чтения этих значений!

<slnc:actualAvailableToBorrow xmlns:slnc="http://www.newyorkfed.org/xml/schemas/SecLending" 
      confidentiality="F" currency="USD" decimals="0" method="AA" 
      multiplier="5" securityLendingType="AA" status="A" value="1474"/>

Как я могу получить для чтения текста значения атрибутов? Для него было бы идеально напечатать значение «валюта», а затем его значение: «F» и т. Д.

Ответы на вопрос(2)

чтобы оно также перебирало атрибуты:

while (textReader.MoveToNextAttribute() || textReader.Read())
{
     case XmlNodeType.Element:
         Console.WriteLine(textReader.Name);
         Console.WriteLine(textReader.Value);
         break;
     //...
     case XmlNodeType.Attribute:
         //use textReader.Name and textReader.Value here for attribute name and value
         break;
}

MoveToNextAttribute Метод переводит читателя к следующему атрибуту в текущем элементе или возвращает false, если не может этого сделать.

 01 нояб. 2015 г., 05:26
Это хорошая идея, я пытался проверить это безрезультатно, но не заметил решающего добавления вwhile заявлениеtextReader.MoveToNextAttribute() !
Решение Вопроса
Get a Single, Named Attribute

XmlTextReader.GetAttribute (MSDN)

case XmlNodeType.Element:
  Console.WriteLine(textReader.Name);
  Console.WriteLine(textReader.Value);
  Console.WriteLine(textReader.GetAttribute("currency"));

Одна приятная особенность этой функции: она не вызовет исключение, если атрибут не определен - она просто вернетNull.

Get All the Attributes

XmlTextReader.MoveToAttribute (MSDN)

Используйте свойство AttributeCount в сочетании с MoveToAttribute:

case XmlNodeType.Element:
  Console.WriteLine(textReader.Name);
  Console.WriteLine(textReader.Value);
  for (int attInd = 0; attInd < textReader.AttributeCount; attInd++){
      textReader.MoveToAttribute( attInd );
      Console.WriteLine(textReader.Name);
      Console.WriteLine(textReader.Value);
  }
  textReader.MoveToElement(); 
 weskpga19 июн. 2012 г., 19:41
Спасибо, это именно то, что я ищу. Просто быстрый вопрос - знаете ли вы, есть ли функция, которая будет получать каждый атрибут в узле, или мне нужно делать это вручную?
 06 мар. 2017 г., 16:38
Я думаюghord's answer может быть немного более производительным, так как вам не нужно перематывать читатель текста после чтения атрибутов. Но я не тестировался, поэтому не знаю, насколько это существенно (вероятно, не так много). Я рекомендую вам выбрать вариант, который делает ваш код легко читаемым, а затем провести рефакторинг, если тестирование показывает существенное узкое место в производительности.

Ваш ответ на вопрос