web-dev-qa-db-fra.com

Lecture des valeurs d'attribut avec XmlReader

J'ai un fichier XML que j'essaie de lire ici , et j'ai le code suivant:

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();
        }
    }
}

Le code fonctionne correctement dans le sens où il lit les nœuds et renvoie les noms. Mais le problème est que j'essaie également de récupérer les données dans les nœuds. En d'autres termes, lorsqu'il lit la première section après la section de test, il lit:

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

C'est là que je veux que le textreader lise les valeurs suivantes dans le nœud comme confidentiality="F", currency="USD", etc., mais il passe directement à la section suivante sans lire ces valeurs!

<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"/>

Comment faire pour que le lecteur de texte lise les valeurs d'attribut? Il serait idéal qu'il imprime la valeur "devise", puis sa valeur: "F", et ainsi de suite.

19
weskpga

Obtenez un seul attribut nommé

Utilisez XmlTextReader.GetAttribute (MSDN)

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

Une caractéristique intéressante de cette fonction: elle ne provoquera pas d'exception si l'attribut n'est pas défini - elle renverra simplement Null.

Obtenez tous les attributs

Utilisez XmlTextReader.MoveToAttribute (MSDN)

Utilisez la propriété AttributeCount en combinaison avec 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(); 
46
JDB

Vous pouvez modifier un peu la condition de la boucle afin qu'elle répète également les attributs:

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;
    }
}

La méthode MoveToNextAttribute fait avancer le lecteur vers l'attribut suivant dans l'élément courant ou renvoie false si elle ne peut pas le faire.

15
ghord