Introduction
We have different ways of reading XML, i.e., legacy approach of using
a DOM object to read XML or other approaches.
Background
Let us assume that we have a custom created XML
that has a series of tags and we want to go through the XML and get the value for further processing.
Using the code
The below lines of code explains the usage of LINQ and also the advantages of using LINQ compared to
a legacy approach.
The code is shared below (the legacy code has been commented out). The method reads the XML data/file using LINQ.
Below is the code snippet that I am sharing. As I said this has two versions: LINQ and Latest.
The result will be stored in the Anonymous Class FileToWatch
. Then this will be executed as
a set of objects for looping through the items that we have read from the XML.
var path = Assembly.GetExecutingAssembly().Location;
path = path.Substring(0, path.LastIndexOf('\\')) + "\\" + "LocationsToWatch.xml";
XDocument xmlDoc = XDocument.Load(path);
files = (from x in xmlDoc.Root.Elements("location")
select
new FileToWatch
{
Server = (string)x.Element("server").Value ?? string.Empty,
Drive = (string)x.Element("drive").Value ?? string.Empty,
Folder = (string)x.Element("folder").Value ?? string.Empty,
FileName = (string)x.Element("filename").Value ?? string.Empty,
SendMail = (string)x.Element("sendmail").Value ?? string.Empty,
FullPath = x.Element("folder").Value + x.Element("filename").Value
}).ToList();
Legacy approach, using the DOM object.
var xmlDoc = new XmlDocument();
xmlDoc.Load("LocationsToWatch.xml");
var itemNodes = xmlDoc.SelectNodes("locations");
foreach (XmlNode node in itemNodes)
{
var location = node.SelectNodes("location");
foreach (XmlNode loc in location)
{
var server = loc.SelectSingleNode("server").InnerText;
var drive = loc.SelectSingleNode("drive").InnerText;
var folder = loc.SelectSingleNode("folder").InnerText;
var filename = loc.SelectSingleNode("filename").InnerText;
}
}