not sure how to use XmlNode in C#

user235973457 picture user235973457 · Aug 5, 2013 · Viewed 7.8k times · Source

In C# I need to use XmlNode to get values from these attributes as follows:

Root element (ServerConfig):

  • type

  • version

  • createDate

Child nodes (Items):

  • name

  • source

  • destination

XML:

<?xml version="1.0" encoding="utf-8"?>
<ServerConfig type="ProjectName" version ="1.1.1.2" createDate ="2013-07-30T15:07:19.3859287+02:00" >
<items>
    <item  name="fs" type="directory" source="C:\temp\source" destination="C:\temp\target" action="Create" />
    <item  name="testdoc.txt" type="file" source="C:\temp\source" destination="C:\temp\target" action="Update" />
</items>
</ServerConfig>

C#:

        XmlTextReader reader = new XmlTextReader(fileManager.ConfigFile);
        XmlDocument doc = new XmlDocument();
        XmlNode node = doc.ReadNode(reader);

        // failed to get values here
        var Version = node.Attributes["version"].Value;
        var Type = node.Attributes["type"].Value;
        var Date = node.Attributes["createDate"].Value;

        //how to get values from items/item attributes here?

Your example code much appreciated thanks :)

Answer

Sergey Berezovskiy picture Sergey Berezovskiy · Aug 5, 2013

You can use LINQ to XML (which is preferable in latest .Net versions)

var xdoc = XDocument.Load(fileManager.ConfigFile);
var serverConfig = xdoc.Root;
string version = (string)serverConfig.Attribute("version");
DateTime date = (DateTime)serverConfig.Attribute("createDate");
string type = (string)serverConfig.Attribute("type");

var items = from item in serverConfig.Element("items").Elements()
            select new {
                Name = (string)item.Attribute("name"),
                Type = (string)item.Attribute("type"),
                Source = (string)item.Attribute("source"),
                Destination = (string)item.Attribute("destination")
            };

Take a look - few lines of code and file parsed into strongly-typed variables. Even date is a DateTime object instead of string. And items are collection of anonymous objects with properties corresponding to xml attributes.