Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSharpNotesForProfessionals.pdf
Скачиваний:
57
Добавлен:
20.05.2023
Размер:
6.12 Mб
Скачать

Chapter 69: XmlDocument and the System.Xml namespace

Section 69.1: XmlDocument vs XDocument (Example and comparison)

There are several ways interact with an Xml file.

1.Xml Document

2.XDocument

3.XmlReader/XmlWriter

Before LINQ to XML we were used XMLDocument for manipulations in XML like adding attributes, elements and so on. Now LINQ to XML uses XDocument for the same kind of thing. Syntaxes are much easier than XMLDocument and it requires a minimal amount of code.

Also XDocument is mutch faster as XmlDocument. XmlDoucument is an old and dirty solution for query an XML document.

I am going to show some examples of XmlDocument class and XDocument class class:

Load XML file

string filename = @"C:\temp\test.xml";

XmlDocument

XmlDocument _doc = new XmlDocument(); _doc.Load(filename);

XDocument

XDocument _doc = XDocument.Load(fileName);

Create XmlDocument

XmlDocument

XmlDocument doc = new XmlDocument(); XmlElement root = doc.CreateElement("root"); root.SetAttribute("name", "value"); XmlElement child = doc.CreateElement("child"); child.InnerText = "text node"; root.AppendChild(child); doc.AppendChild(root);

XDocument

XDocument doc = new XDocument(

GoalKicker.com – C# Notes for Professionals

392

new XElement("Root", new XAttribute("name", "value"), new XElement("Child", "text node"))

);

/*result*/

<root name="value"> <child>"TextNode"</child>

</root>

Change InnerText of node in XML

XmlDocument

XmlNode node = _doc.SelectSingleNode("xmlRootNode"); node.InnerText = value;

XDocument

XElement rootNote = _doc.XPathSelectElement("xmlRootNode"); rootNode.Value = "New Value";

Save File after edit

Make sure to safe the xml after any change.

// Safe XmlDocument and XDocument

_doc.Save(filename);

Retrieve Values from XML

XmlDocument

XmlNode node = _doc.SelectSingleNode("xmlRootNode/levelOneChildNode"); string text = node.InnerText;

XDocument

XElement node = _doc.XPathSelectElement("xmlRootNode/levelOneChildNode"); string text = node.Value;

Retrieve value from all from all child elements where attribute = something.

XmlDocument

List<string> valueList = new List<string>(); foreach (XmlNode n in nodelist)

{

if(n.Attributes["type"].InnerText == "City")

{

valueList.Add(n.Attributes["type"].InnerText);

GoalKicker.com – C# Notes for Professionals

393

}

}

XDocument

var accounts = _doc.XPathSelectElements("/data/summary/account").Where(c => c.Attribute("type").Value == "setting").Select(c => c.Value);

Append a node

XmlDocument

XmlNode nodeToAppend = doc.CreateElement("SecondLevelNode"); nodeToAppend.InnerText = "This title is created by code";

/* Append node to parent */

XmlNode firstNode= _doc.SelectSingleNode("xmlRootNode/levelOneChildNode"); firstNode.AppendChild(nodeToAppend);

/*After a change make sure to safe the document*/

_doc.Save(fileName);

XDocument

_doc.XPathSelectElement("ServerManagerSettings/TcpSocket").Add(new XElement("SecondLevelNode"));

/*After a change make sure to safe the document*/

_doc.Save(fileName);

Section 69.2: Reading from XML document

An example XML file

<Sample>

<Account>

<One number="12"/> <Two number="14"/>

</Account>

<Account>

<One number="14"/> <Two number="16"/>

</Account>

</Sample>

Reading from this XML file:

using System.Xml;

using System.Collections.Generic;

public static void Main(string fullpath)

{

var xmldoc = new XmlDocument(); xmldoc.Load(fullpath);

var oneValues = new List<string>();

GoalKicker.com – C# Notes for Professionals

394

// Getting all XML nodes with the tag name

var accountNodes = xmldoc.GetElementsByTagName("Account"); for (var i = 0; i < accountNodes.Count; i++)

{

// Use Xpath to find a node

var account = accountNodes[i].SelectSingleNode("./One"); if (account != null && account.Attributes != null)

{

// Read node attribute oneValues.Add(account.Attributes["number"].Value);

}

}

}

Section 69.3: Basic XML document interaction

public static void Main()

{

var xml = new XmlDocument();

var root = xml.CreateElement("element");

// Creates an attribute, so the element will now be "<element attribute='value' />" root.SetAttribute("attribute", "value");

//All XML documents must have one, and only one, root element xml.AppendChild(root);

//Adding data to an XML document

foreach (var dayOfWeek in Enum.GetNames((typeof(DayOfWeek))))

{

var day = xml.CreateElement("dayOfWeek"); day.SetAttribute("name", dayOfWeek);

// Don't forget to add the new value to the current document! root.AppendChild(day);

}

// Looking for data using XPath; BEWARE, this is case-sensitive var monday = xml.SelectSingleNode("//dayOfWeek[@name='Monday']"); if (monday != null)

{

//Once you got a reference to a particular node, you can delete it

//by navigating through its parent node and asking for removal monday.ParentNode.RemoveChild(monday);

}

// Displays the XML document in the screen; optionally can be saved to a file xml.Save(Console.Out);

}

GoalKicker.com – C# Notes for Professionals

395