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

Чтение значений атрибутов с помощью 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

Здесь я хочу, чтобы программа чтения текста читала следующие значения в node 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" и т.д.

4b9b3361

Ответ 1

Получить одиночный, именованный атрибут

Используйте XmlTextReader.GetAttribute(MSDN)

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

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

Получить все атрибуты

Используйте 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(); 

Ответ 2

Вы можете немного изменить условие цикла, чтобы оно также перебирало атрибуты:

while (textReader.MoveToNextAttribute() || textReader.Read())
{ 
     switch (textReader.NodeType)
     {
         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, если это невозможно.