Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to deal with XML in C#

Tags:

c#

.net

xml

What is the best way to deal with XML documents, XSD etc in C# 2.0?

Which classes to use etc. What are the best practices of parsing and making XML documents etc.

EDIT: .Net 3.5 suggestions are also welcome.

like image 427
Malik Daud Ahmad Khokhar Avatar asked Oct 21 '08 05:10

Malik Daud Ahmad Khokhar


People also ask

What is XML C?

c. Similar to the GLib Markup parser, which also just parses an xml subset, xml. c is a simple, small and self contained xml parser in one file.

Which class is used in C for writing an XML file?

XmlWriter class contains the functionality to write to XML documents. It is an abstract base class used through XmlTextWriter and XmlNodeWriter classes. It contains methods and properties to write to XML documents.


1 Answers

The primary means of reading and writing in C# 2.0 is done through the XmlDocument class. You can load most of your settings directly into the XmlDocument through the XmlReader it accepts.

Loading XML Directly

XmlDocument document = new XmlDocument(); document.LoadXml("<People><Person Name='Nick' /><Person Name='Joe' /></People>"); 

Loading XML From a File

XmlDocument document = new XmlDocument(); document.Load(@"C:\Path\To\xmldoc.xml"); // Or using an XmlReader/XmlTextReader XmlReader reader = XmlReader.Create(@"C:\Path\To\xmldoc.xml"); document.Load(reader); 

I find the easiest/fastest way to read an XML document is by using XPath.

Reading an XML Document using XPath (Using XmlDocument which allows us to edit)

XmlDocument document = new XmlDocument(); document.LoadXml("<People><Person Name='Nick' /><Person Name='Joe' /></People>");  // Select a single node XmlNode node = document.SelectSingleNode("/People/Person[@Name = 'Nick']");  // Select a list of nodes XmlNodeList nodes = document.SelectNodes("/People/Person"); 

If you need to work with XSD documents to validate an XML document you can use this.

Validating XML Documents against XSD Schemas

XmlReaderSettings settings = new XmlReaderSettings(); settings.ValidateType = ValidationType.Schema; settings.Schemas.Add("", pathToXsd); // targetNamespace, pathToXsd  XmlReader reader = XmlReader.Create(pathToXml, settings); XmlDocument document = new XmlDocument();  try {     document.Load(reader); } catch (XmlSchemaValidationException ex) { Trace.WriteLine(ex.Message); } 

Validating XML against XSD at each Node (UPDATE 1)

XmlReaderSettings settings = new XmlReaderSettings(); settings.ValidateType = ValidationType.Schema; settings.Schemas.Add("", pathToXsd); // targetNamespace, pathToXsd settings.ValidationEventHandler += new ValidationEventHandler(settings_ValidationEventHandler);  XmlReader reader = XmlReader.Create(pathToXml, settings); while (reader.Read()) { }  private void settings_ValidationEventHandler(object sender, ValidationEventArgs args) {     // e.Message, e.Severity (warning, error), e.Error     // or you can access the reader if you have access to it     // reader.LineNumber, reader.LinePosition.. etc } 

Writing an XML Document (manually)

XmlWriter writer = XmlWriter.Create(pathToOutput); writer.WriteStartDocument(); writer.WriteStartElement("People");  writer.WriteStartElement("Person"); writer.WriteAttributeString("Name", "Nick"); writer.WriteEndElement();  writer.WriteStartElement("Person"); writer.WriteStartAttribute("Name"); writer.WriteValue("Nick"); writer.WriteEndAttribute(); writer.WriteEndElement();  writer.WriteEndElement(); writer.WriteEndDocument();  writer.Flush(); 

(UPDATE 1)

In .NET 3.5, you use XDocument to perform similar tasks. The difference however is you have the advantage of performing Linq Queries to select the exact data you need. With the addition of object initializers you can create a query that even returns objects of your own definition right in the query itself.

    XDocument doc = XDocument.Load(pathToXml);     List<Person> people = (from xnode in doc.Element("People").Elements("Person")                        select new Person                        {                            Name = xnode.Attribute("Name").Value                        }).ToList(); 

(UPDATE 2)

A nice way in .NET 3.5 is to use XDocument to create XML is below. This makes the code appear in a similar pattern to the desired output.

XDocument doc =         new XDocument(               new XDeclaration("1.0", Encoding.UTF8.HeaderName, String.Empty),               new XComment("Xml Document"),               new XElement("catalog",                     new XElement("book", new XAttribute("id", "bk001"),                           new XElement("title", "Book Title")                     )               )         ); 

creates

<!--Xml Document--> <catalog>   <book id="bk001">     <title>Book Title</title>   </book> </catalog> 

All else fails, you can check out this MSDN article that has many examples that I've discussed here and more. http://msdn.microsoft.com/en-us/library/aa468556.aspx

like image 186
nyxtom Avatar answered Sep 22 '22 23:09

nyxtom