Reading attribute values with XmlReader

57,370

Solution 1

Get a Single, Named Attribute

Use XmlTextReader.GetAttribute (MSDN)

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

One nice feature of this function: it will not cause an Exception if the attribute is not defined - it will simply return Null.

Get All the Attributes

Use XmlTextReader.MoveToAttribute (MSDN)

Use the AttributeCount property in combination with 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(); 

Solution 2

You could change the loop condition a bit so that it also iterates through attributes:

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 method advances reader to the next attribute in current element or returns false if it cannot do so.

Share:
57,370

Related videos on Youtube

weskpga
Author by

weskpga

I am an ECE/Computer Science double major in the Duke University class of 2015.

Updated on July 09, 2022

Comments

  • weskpga
    weskpga almost 2 years

    I have an XML file that I'm trying to read from here, and have the following code:

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

    The code is working properly in the sense that it's reading the nodes and returning the names. But, the issue is that I'm trying to also retrieve the data within the nodes. In other words, when it reads the first section after the test section, it will read:

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

    This is where I want the textreader to read the following values within the node like confidentiality="F", currency="USD", etc., but it just skips right to the next section without reading these values!

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

    How do I get the textreader to read the attribute values? It would be ideal for it to print the value "currency", and then its value: "F", and so on.

  • weskpga
    weskpga almost 12 years
    Thanks, this is exactly what I'm looking for. Just a quick follow up question - do you know if there's a function that will get every attribute in a node, or do I have to do that manually?
  • wired00
    wired00 over 8 years
    This is a nice idea, I was trying to test this with no results, but didn't notice the crucial addition in the while statement textReader.MoveToNextAttribute() !
  • JDB
    JDB about 7 years
    I think ghord's answer might be slightly more performant, since you don't have to rewind the text reader after reading the attributes. But I've not tested so I don't know how big a difference it makes (probably not much). I recommend that you choose the option that makes your code easy to read, then refactor if testing shows a significant performance bottleneck.