Mohit Deshpande
Mohit Deshpande

Reputation: 55227

How to read XML attributes in C#?

I have several XML files that I wish to read attributes from. My main objective is to apply syntax highlighting to rich text box.

For example in one of my XML docs I have: <Keyword name="using">[..] All the files have the same element: Keyword.

So, how can I get the value for the attribute name and put them in a collection of strings for each XML file.

I am using Visual C# 2008.

Upvotes: 5

Views: 19546

Answers (6)

Gobind Singh Samrow
Gobind Singh Samrow

Reputation: 21

**<Countries>
  <Country name ="ANDORRA">
    <state>Andorra (general)</state>
    <state>Andorra</state>
  </Country>
  <Country name ="United Arab Emirates">
    <state>Abu Z¸aby</state>
    <state>Umm al Qaywayn</state>
  </Country>**



 public void datass(string file)
  {

            string file = HttpContext.Current.Server.MapPath("~/App_Data/CS.xml");
                XmlDocument doc = new XmlDocument();
                if (System.IO.File.Exists(file))
                {
                    //Load the XML File
                    doc.Load(file);

                }


                //Get the root element
                XmlElement root = doc.DocumentElement;
                XmlNodeList subroot = root.SelectNodes("Country");

                for (int i = 0; i < subroot.Count; i++)     
                {

                    XmlNode elem = subroot.Item(i);
                    string attrVal = elem.Attributes["name"].Value;
                    Response.Write(attrVal);
                    XmlNodeList sub = elem.SelectNodes("state");
                    for (int j = 0; j < sub.Count; j++)
                    {
                        XmlNode elem1 = sub.Item(j);
                        Response.Write(elem1.InnerText);

                    }
                }

    }

Upvotes: 0

JohnIdol
JohnIdol

Reputation: 50097

The other answers will do the job - but the syntax highlighting thingy and the several xml files you say you have makes me thinks you need something faster, why not use a lean and mean XmlReader?

private string[] getNames(string fileName)
{

  XmlReader xmlReader = XmlReader.Create(fileName);
  List<string> names = new List<string>(); 

  while (xmlReader.Read())
  {
   //keep reading until we see your element
   if (xmlReader.Name.Equals("Keyword") && (xmlReader.NodeType == XmlNodeType.Element))
   {
     // get attribute from the Xml element here
     string name = xmlReader.GetAttribute("name");
     // --> now **add to collection** - or whatever
     names.Add(name);
   }
  }

  return names.ToArray();
}

Another good option would be the XPathNavigator class - which is faster than XmlDoc and you can use XPath.

Also I would suggest to go with this approach only IFF after you try with the straightforward options you're not happy with performance.

Upvotes: 4

Jon Skeet
Jon Skeet

Reputation: 1500055

Like others, I would suggest using LINQ to XML - but I don't think there's much need to use XPath here. Here's a simple method to return all the keyword names within a file:

static IEnumerable<string> GetKeywordNames(string file)
{
    return XDocument.Load(file)
                    .Descendants("Keyword")
                    .Attributes("name")
                    .Select(attr => attr.Value);
}

Nice and declarative :)

Note that if you're going to want to use the result more than once, you should call ToList() or ToArray() on it, otherwise it'll reload the file each time. Of course you could change the method to return List<string> or string[] by -adding the relevant call to the end of the chain of method calls, e.g.

static List<string> GetKeywordNames(string file)
{
    return XDocument.Load(file)
                    .Descendants("Keyword")
                    .Attributes("name")
                    .Select(attr => attr.Value)
                    .ToList();
}

Also note that this just gives you the names - I would have expected you to want the other details of the elements, in which case you'd probably want something slightly different. If it turns out you need more, please let us know.

Upvotes: 3

driis
driis

Reputation: 164281

You could use XPath to get all the elements, then a LINQ query to get the values on all the name atttributes you find:

 XDocument doc = yourDocument;
 var nodes = from element in doc.XPathSelectElements("//Keyword")
             let att = element.Attribute("name")
             where att != null
             select att.Value;
 string[] names = nodes.ToArray();

The //Keyword XPath expression means, "all elements in the document, named "Keyword".

Edit: Just saw that you only want elements named Keyword. Updated the code sample.

Upvotes: 3

Ryan Emerle
Ryan Emerle

Reputation: 15811

You'll likely want to use XPath. //Keyword/@name should get you all of the keyword names.

Here's a good introduction: .Net and XML XPath Queries

Upvotes: 0

Joseph
Joseph

Reputation: 25513

You could use LINQ to XML.

Example:

var xmlFile = XDocument.Load(someFile);
var query = from item in xmlFile.Descendants("childobject")
            where !String.IsNullOrEmpty(item.Attribute("using")
            select new 
            {
                AttributeValue = item.Attribute("using").Value
            };

Upvotes: 0

Related Questions