System.Xml.XmlDocument class - .NET (2024)

  • Article

This article provides supplementary remarks to the reference documentation for this API.

The XmlDocument class is an in-memory representation of an XML document. It implements the W3C XML Document Object Model (DOM) Level 1 Core and the Core DOM Level 2.

DOM stands for document object model. To read more about it, see XML Document Object Model (DOM).

You can load XML into the DOM by using the XmlDocument class, and then programmatically read, modify, and remove XML in the document.

If you want to pry open the XmlDocument class and see how it's implemented, see the Reference Source.

Load XML into the document object model

Start with an XML document like this one that has a few books in a collection. It contains the basic things that you'd find in any XML document, including a namespace, elements that represent data, and attributes that describe the data.

<?xml version="1.0" encoding="utf-8"?><books xmlns="http://www.contoso.com/books"> <book genre="novel" ISBN="1-861001-57-8" publicationdate="1823-01-28"> <title>Pride And Prejudice</title> <price>24.95</price> </book> <book genre="novel" ISBN="1-861002-30-1" publicationdate="1985-01-01"> <title>The Handmaid's Tale</title> <price>29.95</price> </book> <book genre="novel" ISBN="1-861001-45-3" publicationdate="1811-01-01"> <title>Sense and Sensibility</title> <price>19.95</price> </book></books>

Next, load this data into the DOM so that you can work with it in memory. The most popular way to do this is refer to a file on your local computer or on a network.

This example loads XML from a file. If the file doesn't exist, it just generates some XML and loads that.

XmlDocument doc = new XmlDocument();doc.PreserveWhitespace = true;try { doc.Load("booksData.xml"); }catch (System.IO.FileNotFoundException){ doc.LoadXml("<?xml version=\"1.0\"?> \n" + "<books xmlns=\"http://www.contoso.com/books\"> \n" + " <book genre=\"novel\" ISBN=\"1-861001-57-8\" publicationdate=\"1823-01-28\"> \n" + " <title>Pride And Prejudice</title> \n" + " <price>24.95</price> \n" + " </book> \n" + " <book genre=\"novel\" ISBN=\"1-861002-30-1\" publicationdate=\"1985-01-01\"> \n" + " <title>The Handmaid's Tale</title> \n" + " <price>29.95</price> \n" + " </book> \n" + "</books>");}
Dim doc As XmlDocument = New XmlDocumentdoc.PreserveWhitespace = TrueTry doc.Load("booksData.xml")Catch ex As System.IO.FileNotFoundException ' If no file is found, generate some XML. doc.LoadXml("<?xml version=""1.0""?> " & ControlChars.NewLine & _ "<books xmlns=""http://www.contoso.com/books""> " & ControlChars.NewLine & _ " <book genre=""novel"" ISBN=""1-861001-57-8"" publicationdate=""1823-01-28""> " & ControlChars.NewLine & _ " <title>Pride And Prejudice</title> " & ControlChars.NewLine & _ " <price>24.95</price> " & ControlChars.NewLine & _ " </book> " & ControlChars.NewLine & _ " <book genre=""novel"" ISBN=""1-861002-30-1"" publicationdate=""1985-01-01""> " & ControlChars.NewLine & _ " <title>The Handmaid's Tale</title> " & ControlChars.NewLine & _ " <price>29.95</price> " & ControlChars.NewLine & _ " </book> " & ControlChars.NewLine & _ "</books>")End Try

For more information, see Reading an XML Document into the DOM.

Validate it against a schema

Start with an XML schema like this one. This schema defines the data types in the XML and which attributes are required.

<?xml version="1.0" encoding="utf-8"?><xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.contoso.com/books"> <xs:element name="books"> <xs:complexType> <xs:sequence> <xs:element maxOccurs="unbounded" name="book"> <xs:complexType> <xs:sequence> <xs:element name="title" type="xs:string" /> <xs:element name="price" type="xs:decimal" /> </xs:sequence> <xs:attribute name="genre" type="xs:string" use="required" /> <xs:attribute name="ISBN" type="xs:string" use="required" /> <xs:attribute name="publicationdate" type="xs:date" use="required" /> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element></xs:schema>

Create an XmlReader object by using your schema, and then load that object into the DOM. Create an event handler that executes when code attempts to modify your XML file in ways that violate the rules of the schema.

These blocks of code show helper methods that do all of this.

//************************************************************************************//// Helper method that generates an XML string.////************************************************************************************private string generateXMLString(){ string xml = "<?xml version=\"1.0\"?> \n" + "<books xmlns=\"http://www.contoso.com/books\"> \n" + " <book genre=\"novel\" ISBN=\"1-861001-57-8\" publicationdate=\"1823-01-28\"> \n" + " <title>Pride And Prejudice</title> \n" + " <price>24.95</price> \n" + " </book> \n" + " <book genre=\"novel\" ISBN=\"1-861002-30-1\" publicationdate=\"1985-01-01\"> \n" + " <title>The Handmaid's Tale</title> \n" + " <price>29.95</price> \n" + " </book> \n" + " <book genre=\"novel\" ISBN=\"1-861001-45-3\" publicationdate=\"1811-01-01\"> \n" + " <title>Sense and Sensibility</title> \n" + " <price>19.95</price> \n" + " </book> \n" + "</books>"; return xml;}//************************************************************************************//// Associate the schema with XML. Then, load the XML and validate it against// the schema.////************************************************************************************public XmlDocument LoadDocumentWithSchemaValidation(bool generateXML, bool generateSchema){ XmlReader reader = null; XmlReaderSettings settings = new XmlReaderSettings(); // Helper method to retrieve schema. XmlSchema schema = getSchema(generateSchema); settings.Schemas.Add(schema); settings.ValidationEventHandler += ValidationCallback; settings.ValidationFlags = settings.ValidationFlags | XmlSchemaValidationFlags.ReportValidationWarnings; settings.ValidationType = ValidationType.Schema; if (!generateXML) { try { reader = XmlReader.Create("booksData.xml", settings); } catch (FileNotFoundException ex) { Console.WriteLine( $"XML file not found so generating: {ex.Message}"); generateXML = true; } } if (generateXML) { string xml = generateXMLString(); StringReader stringReader = new StringReader(xml); reader = XmlReader.Create(stringReader, settings); } XmlDocument doc = new XmlDocument(); doc.PreserveWhitespace = true; doc.Load(reader); reader.Close(); return doc;}//************************************************************************************//// Helper method that generates an XML Schema.////************************************************************************************private string generateXMLSchema(){ string xmlSchema = "<?xml version=\"1.0\" encoding=\"utf-8\"?> " + "<xs:schema attributeFormDefault=\"unqualified\" " + "elementFormDefault=\"qualified\" targetNamespace=\"http://www.contoso.com/books\" " + "xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"> " + "<xs:element name=\"books\"> " + "<xs:complexType> " + "<xs:sequence> " + "<xs:element maxOccurs=\"unbounded\" name=\"book\"> " + "<xs:complexType> " + "<xs:sequence> " + "<xs:element name=\"title\" type=\"xs:string\" /> " + "<xs:element name=\"price\" type=\"xs:decimal\" /> " + "</xs:sequence> " + "<xs:attribute name=\"genre\" type=\"xs:string\" use=\"required\" /> " + "<xs:attribute name=\"publicationdate\" type=\"xs:date\" use=\"required\" /> " + "<xs:attribute name=\"ISBN\" type=\"xs:string\" use=\"required\" /> " + "</xs:complexType> " + "</xs:element> " + "</xs:sequence> " + "</xs:complexType> " + "</xs:element> " + "</xs:schema> "; return xmlSchema;}//************************************************************************************//// Helper method that gets a schema////************************************************************************************private XmlSchema getSchema(bool generateSchema){ XmlSchemaSet xs = new XmlSchemaSet(); XmlSchema schema = null; if (!generateSchema) { try { schema = xs.Add("http://www.contoso.com/books", "booksData.xsd"); } catch (FileNotFoundException ex) { Console.WriteLine( $"XSD file not found so generating: {ex.Message}"); generateSchema = true; } } if (generateSchema) { string xmlSchemaString = generateXMLSchema(); StringReader stringReader = new StringReader(xmlSchemaString); XmlReader reader = XmlReader.Create(stringReader); schema = xs.Add("http://www.contoso.com/books", reader); } return schema;}//************************************************************************************//// Helper method to validate the XML against the schema.////************************************************************************************private void validateXML(bool generateSchema, XmlDocument doc){ if (doc.Schemas.Count == 0) { // Helper method to retrieve schema. XmlSchema schema = getSchema(generateSchema); doc.Schemas.Add(schema); } // Use a callback to validate the XML node against the schema. doc.Validate(ValidationCallback);}//************************************************************************************//// Event handler that is raised when XML doesn't validate against the schema.////************************************************************************************void ValidationCallback(object sender, System.Xml.Schema.ValidationEventArgs e){ if (e.Severity == XmlSeverityType.Warning) { Console.WriteLine ("The following validation warning occurred: " + e.Message); } else if (e.Severity == XmlSeverityType.Error) { Console.WriteLine ("The following critical validation errors occurred: " + e.Message); }}
'************************************************************************************'' Associate the schema with XML. Then, load the XML and validate it against' the schema.''************************************************************************************Public Function LoadDocumentWithSchemaValidation(ByVal generateXML As Boolean, ByVal generateSchema As Boolean) As XmlDocument Dim reader As XmlReader Dim settings As XmlReaderSettings = New XmlReaderSettings ' Helper method to retrieve schema. Dim schema As XmlSchema = getSchema(generateSchema) If (schema Is Nothing) Then Return Nothing End If settings.Schemas.Add(schema) AddHandler settings.ValidationEventHandler, AddressOf settings_ValidationEventHandler settings.ValidationFlags = (settings.ValidationFlags Or XmlSchemaValidationFlags.ReportValidationWarnings) settings.ValidationType = ValidationType.Schema Try reader = XmlReader.Create("booksData.xml", settings) Catch ex As System.IO.FileNotFoundException If generateXML Then Dim xml As String = generateXMLString() Dim byteArray() As Byte = Encoding.UTF8.GetBytes(xml) Dim stream As MemoryStream = New MemoryStream(byteArray) reader = XmlReader.Create(stream, settings) Else Return Nothing End If End Try Dim doc As XmlDocument = New XmlDocument doc.PreserveWhitespace = True doc.Load(reader) reader.Close() Return docEnd Function'************************************************************************************'' Helper method that generates an XML Schema.''************************************************************************************Private Function generateXMLSchema() As String Dim generatedXmlSchema As String = "<?xml version=""1.0"" encoding=""utf-8""?> " & _ "<xs:schema attributeFormDefault=""unqualified"" " & _ "elementFormDefault=""qualified"" targetNamespace=""http://www.contoso.com/books"" " & _ "xmlns:xs=""http://www.w3.org/2001/XMLSchema""> " & _ "<xs:element name=""books""> " & _ "<xs:complexType> " & _ "<xs:sequence> " & _ "<xs:element maxOccurs=""unbounded"" name=""book""> " & _ "<xs:complexType> " & _ "<xs:sequence> " & _ "<xs:element name=""title"" type=""xs:string"" /> " & _ "<xs:element name=""price"" type=""xs:decimal"" /> " & _ "</xs:sequence> " & _ "<xs:attribute name=""genre"" type=""xs:string"" use=""required"" /> " & _ "<xs:attribute name=""publicationdate"" type=""xs:date"" use=""required"" /> " & _ "<xs:attribute name=""ISBN"" type=""xs:string"" use=""required"" /> " & _ "</xs:complexType> " & _ "</xs:element> " & _ "</xs:sequence> " & _ "</xs:complexType> " & _ "</xs:element> " & _ "</xs:schema> " Return generatedXmlSchemaEnd Function'************************************************************************************'' Helper method that gets a schema''************************************************************************************Private Function getSchema(ByVal generateSchema As Boolean) As XmlSchema Dim xs As XmlSchemaSet = New XmlSchemaSet Dim schema As XmlSchema Try schema = xs.Add("http://www.contoso.com/books", "booksData.xsd") Catch ex As System.IO.FileNotFoundException If generateSchema Then Dim xmlSchemaString As String = generateXMLSchema() Dim byteArray() As Byte = Encoding.UTF8.GetBytes(xmlSchemaString) Dim stream As MemoryStream = New MemoryStream(byteArray) Dim reader As XmlReader = XmlReader.Create(stream) schema = xs.Add("http://www.contoso.com/books", reader) Else Return Nothing End If End Try Return schemaEnd Function'************************************************************************************'' Helper method to validate the XML against the schema.''************************************************************************************Private Sub validateXML(ByVal generateSchema As Boolean, ByVal doc As XmlDocument) If (doc.Schemas.Count = 0) Then ' Helper method to retrieve schema. Dim schema As XmlSchema = getSchema(generateSchema) doc.Schemas.Add(schema) End If ' Use an event handler to validate the XML node against the schema. doc.Validate(AddressOf settings_ValidationEventHandler)End Sub'************************************************************************************'' Event handler that is raised when XML doesn't validate against the schema.''************************************************************************************Private Sub settings_ValidationEventHandler(ByVal sender As Object, ByVal e As System.Xml.Schema.ValidationEventArgs) If (e.Severity = XmlSeverityType.Warning) Then System.Windows.Forms.MessageBox.Show(("The following validation warning occurred: " & e.Message)) ElseIf (e.Severity = XmlSeverityType.Error) Then System.Windows.Forms.MessageBox.Show(("The following critical validation errors occurred: " & e.Message)) Dim objectType As Type = sender.GetType End IfEnd Sub

For more information, see Validating an XML Document in the DOM.

Navigate the document tree

You can use properties to navigate around an XML document. But before you use any of them, let's quickly review a few terms. Your document is composed of nodes. Each node has a single parent node directly above it. The only node that does not have a parent node is the document root, as it is the top-level node. Most nodes can have child nodes, which are nodes directly below them. Nodes that are at the same level are siblings.

The following examples show you how to obtain the root node, jump to the first child node of the root node, access any of its child nodes, get back out to the parent node, and then navigate across sibling nodes.

Start with the root node

This example gets the root node and then uses that node to output the contents of the document to the console.

using System;using System.IO;using System.Xml;public class Sample{ public static void Main() { //Create the XmlDocument. XmlDocument doc = new XmlDocument(); doc.LoadXml("<?xml version='1.0' ?>" + "<book genre='novel' ISBN='1-861001-57-5'>" + "<title>Pride And Prejudice</title>" + "</book>"); //Display the document element. Console.WriteLine(doc.DocumentElement.OuterXml); }}
Option Strict OnOption Explicit OnImports System.XmlPublic Class ElementSample Public Shared Sub Main() 'Create the XmlDocument. Dim doc As New XmlDocument() doc.LoadXml("<?xml version='1.0' ?>" & "<book genre='novel' ISBN='1-861001-57-5'>" & "<title>Pride And Prejudice</title>" & "</book>") 'Display the document element. Console.WriteLine(doc.DocumentElement.OuterXml) End SubEnd Class

Get child nodes

This example jumps to the first child node of the root node and then iterates through the child nodes of that node if any exist.

using System;using System.Xml;public class Sample2{ public static void Main() { XmlDocument doc = new XmlDocument(); doc.LoadXml("<book ISBN='1-861001-57-5'>" + "<title>Pride And Prejudice</title>" + "<price>19.95</price>" + "</book>"); XmlNode root = doc.FirstChild; //Display the contents of the child nodes. if (root.HasChildNodes) { for (int i = 0; i < root.ChildNodes.Count; i++) { Console.WriteLine(root.ChildNodes[i].InnerText); } } }}
Option StrictOption ExplicitImports System.IOImports System.XmlPublic Class Sample Public Shared Sub Main() Dim doc As New XmlDocument() doc.LoadXml("<book ISBN='1-861001-57-5'>" & _ "<title>Pride And Prejudice</title>" & _ "<price>19.95</price>" & _ "</book>") Dim root As XmlNode = doc.FirstChild 'Display the contents of the child nodes. If root.HasChildNodes Then Dim i As Integer For i = 0 To root.ChildNodes.Count - 1 Console.WriteLine(root.ChildNodes(i).InnerText) Next i End If End SubEnd Class

Get back to the parent node

Use the ParentNode property.

Refer to the last child node

This example writes the price of a book to the console. The price node is the last child of a book node.

using System;using System.Xml;public class Sample3{ public static void Main() { XmlDocument doc = new XmlDocument(); doc.LoadXml("<book ISBN='1-861001-57-5'>" + "<title>Pride And Prejudice</title>" + "<price>19.95</price>" + "</book>"); XmlNode root = doc.FirstChild; Console.WriteLine("Display the price element..."); Console.WriteLine(root.LastChild.OuterXml); }}
Option Explicit OnOption Strict OnImports System.XmlPublic Class LastChildSample Public Shared Sub Main() Dim doc As New XmlDocument() doc.LoadXml("<book ISBN='1-861001-57-5'>" & "<title>Pride And Prejudice</title>" & "<price>19.95</price>" & "</book>") Dim root As XmlNode = doc.FirstChild Console.WriteLine("Display the price element...") Console.WriteLine(root.LastChild.OuterXml) End SubEnd Class

Navigate forward across siblings

This example moves forward from book to book. Book nodes are siblings to one another.

using System;using System.Xml;public class Sample4{ public static void Main() { XmlDocument doc = new XmlDocument(); doc.Load("books.xml"); XmlNode currNode = doc.DocumentElement.FirstChild; Console.WriteLine("First book..."); Console.WriteLine(currNode.OuterXml); XmlNode nextNode = currNode.NextSibling; Console.WriteLine("\r\nSecond book..."); Console.WriteLine(nextNode.OuterXml); }}
Imports System.XmlPublic Class NextSiblingSample Public Shared Sub Main() Dim doc As XmlDocument = New XmlDocument() doc.Load("books.xml") Dim currNode As XmlNode = doc.DocumentElement.FirstChild Console.WriteLine("First book...") Console.WriteLine(currNode.OuterXml) Dim nextNode As XmlNode = currNode.NextSibling Console.WriteLine(ControlChars.Lf + "Second book...") Console.WriteLine(nextNode.OuterXml) End SubEnd Class

Navigate backwards across siblings

This example moves backwards from book to book.

using System;using System.Xml;public class Sample { public static void Main() { XmlDocument doc = new XmlDocument(); doc.Load("books.xml"); XmlNode lastNode = doc.DocumentElement.LastChild; Console.WriteLine("Last book..."); Console.WriteLine(lastNode.OuterXml); XmlNode prevNode = lastNode.PreviousSibling; Console.WriteLine("\r\nPrevious book..."); Console.WriteLine(prevNode.OuterXml); }}
Imports System.XmlPublic Class Sample5 Public Shared Sub Main() Dim doc As XmlDocument = New XmlDocument() doc.Load("books.xml") Dim lastNode As XmlNode = doc.DocumentElement.LastChild Console.WriteLine("Last book...") Console.WriteLine(lastNode.OuterXml) Dim prevNode As XmlNode = lastNode.PreviousSibling Console.WriteLine(ControlChars.Lf + "Previous book...") Console.WriteLine(prevNode.OuterXml) End SubEnd Class

Find nodes

The most popular way to find one or more nodes of data is to use an XPath query string, but there are also methods that don't require one.

Get a single node

This example locates a book by using the ISBN number.

public XmlNode GetBook(string uniqueAttribute, XmlDocument doc){ XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable); nsmgr.AddNamespace("bk", "http://www.contoso.com/books"); string xPathString = "//bk:books/bk:book[@ISBN='" + uniqueAttribute + "']"; XmlNode xmlNode = doc.DocumentElement.SelectSingleNode(xPathString, nsmgr); return xmlNode;}
Public Function GetBook(ByVal uniqueAttribute As String, ByVal doc As XmlDocument) As XmlNode Dim nsmgr As XmlNamespaceManager = New XmlNamespaceManager(doc.NameTable) nsmgr.AddNamespace("bk", "http://www.contoso.com/books") Dim xPathString As String = ("//bk:books/bk:book[@ISBN='" _ & (uniqueAttribute & "']")) Dim xmlNode As XmlNode = doc.DocumentElement.SelectSingleNode(xPathString, nsmgr) Return xmlNodeEnd Function

The string used in this example is an Xpath query. You can find more examples of them at XPath examples.

You can also use the GetElementById to retrieve nodes. To use this approach, you'll have to define ID's in the document type definition declarations of your XML file.

After you get a node, you get the value of attributes or child nodes. This example does that with a book node.

public void GetBookInformation(ref string title, ref string ISBN, ref string publicationDate, ref string price, ref string genre, XmlNode book){ XmlElement bookElement = (XmlElement)book; // Get the attributes of a book. XmlAttribute attr = bookElement.GetAttributeNode("ISBN"); ISBN = attr.InnerXml; attr = bookElement.GetAttributeNode("genre"); genre = attr.InnerXml; attr = bookElement.GetAttributeNode("publicationdate"); publicationDate = attr.InnerXml; // Get the values of child elements of a book. title = bookElement["title"].InnerText; price = bookElement["price"].InnerText;}
Public Sub GetBookInformation(ByRef title As String, ByRef ISBN As String, ByRef publicationDate As String, ByRef price As String, ByRef genre As String, ByVal book As XmlNode) Dim bookElement As XmlElement = CType(book, XmlElement) ' Get the attributes of a book. Dim attr As XmlAttribute = bookElement.GetAttributeNode("ISBN") ISBN = attr.InnerXml attr = bookElement.GetAttributeNode("genre") genre = attr.InnerXml attr = bookElement.GetAttributeNode("publicationdate") publicationDate = attr.InnerXml ' Get the values of child elements of a book. title = bookElement("title").InnerText price = bookElement("price").InnerTextEnd Sub

Get a collection of nodes

This example selects all books where the author's last name is Austen, and then changes the price of those books.

using System;using System.Xml;public class Sample6{ public static void Main() { XmlDocument doc = new XmlDocument(); doc.Load("booksort.xml"); XmlNodeList nodeList; XmlNode root = doc.DocumentElement; nodeList = root.SelectNodes("descendant::book[author/last-name='Austen']"); //Change the price on the books. foreach (XmlNode book in nodeList) { book.LastChild.InnerText = "15.95"; } Console.WriteLine("Display the modified XML document...."); doc.Save(Console.Out); }}
Imports System.IOImports System.Xmlpublic class Sample public shared sub Main() 'Create the XmlDocument. Dim doc as XmlDocument = new XmlDocument() doc.Load("booksort.xml") Dim book as XmlNode Dim nodeList as XmlNodeList Dim root as XmlNode = doc.DocumentElement nodeList=root.SelectNodes("descendant::book[author/last-name='Austen']") 'Change the price on the books. for each book in nodeList book.LastChild.InnerText="15.95" next Console.WriteLine("Display the modified XML document....") doc.Save(Console.Out) end subend class

You can also get a collection of nodes by using the name of the node. For example, this example gets a collection of all book titles.

using System;using System.Xml;public class Sample1{ public static void Main() { //Create the XmlDocument. XmlDocument doc = new XmlDocument(); doc.Load("books.xml"); //Display all the book titles. XmlNodeList elemList = doc.GetElementsByTagName("title"); for (int i = 0; i < elemList.Count; i++) { Console.WriteLine(elemList[i].InnerXml); } }}
Option Explicit OnOption Strict OnImports System.XmlPublic Class TagSample Public Shared Sub Main() 'Create the XmlDocument. Dim doc As New XmlDocument() doc.Load("books.xml") 'Display all the book titles. Dim elemList As XmlNodeList = doc.GetElementsByTagName("title") Dim i As Integer For i = 0 To elemList.Count - 1 Console.WriteLine(elemList(i).InnerXml) Next i End SubEnd Class

For more information, see Select Nodes Using XPath Navigation.

Edit nodes

This example edits a book node and its attributes.

public void editBook(string title, string ISBN, string publicationDate, string genre, string price, XmlNode book, bool validateNode, bool generateSchema){ XmlElement bookElement = (XmlElement)book; // Get the attributes of a book. bookElement.SetAttribute("ISBN", ISBN); bookElement.SetAttribute("genre", genre); bookElement.SetAttribute("publicationdate", publicationDate); // Get the values of child elements of a book. bookElement["title"].InnerText = title; bookElement["price"].InnerText = price; if (validateNode) { validateXML(generateSchema, bookElement.OwnerDocument); }}
Public Sub editBook(ByVal title As String, ByVal ISBN As String, ByVal publicationDate As String, ByVal genre As String, ByVal price As String, ByVal book As XmlNode, ByVal validateNode As Boolean, ByVal generateSchema As Boolean) Dim bookElement As XmlElement = CType(book, XmlElement) ' Get the attributes of a book. bookElement.SetAttribute("ISBN", ISBN) bookElement.SetAttribute("genre", genre) bookElement.SetAttribute("publicationdate", publicationDate) ' Get the values of child elements of a book. bookElement("title").InnerText = title bookElement("price").InnerText = price If validateNode Then validateXML(generateSchema, bookElement.OwnerDocument) End IfEnd Sub

For more information, see Modifying Nodes, Content, and Values in an XML Document.

Add nodes

To add a node, use the CreateElement method or the CreateNode method.

To add a data node such as a book, use the CreateElement method.

For any other type of node such as a comment, whitespace node, or CDATA node, use the CreateNode method.

This example creates a book node, adds attributes to that node, and then adds that node to the document.

public XmlElement AddNewBook(string genre, string ISBN, string misc, string title, string price, XmlDocument doc){ // Create a new book element. XmlElement bookElement = doc.CreateElement("book", "http://www.contoso.com/books"); // Create attributes for book and append them to the book element. XmlAttribute attribute = doc.CreateAttribute("genre"); attribute.Value = genre; bookElement.Attributes.Append(attribute); attribute = doc.CreateAttribute("ISBN"); attribute.Value = ISBN; bookElement.Attributes.Append(attribute); attribute = doc.CreateAttribute("publicationdate"); attribute.Value = misc; bookElement.Attributes.Append(attribute); // Create and append a child element for the title of the book. XmlElement titleElement = doc.CreateElement("title"); titleElement.InnerText = title; bookElement.AppendChild(titleElement); // Introduce a newline character so that XML is nicely formatted. bookElement.InnerXml = bookElement.InnerXml.Replace(titleElement.OuterXml, "\n " + titleElement.OuterXml + " \n "); // Create and append a child element for the price of the book. XmlElement priceElement = doc.CreateElement("price"); priceElement.InnerText= price; bookElement.AppendChild(priceElement); // Introduce a newline character so that XML is nicely formatted. bookElement.InnerXml = bookElement.InnerXml.Replace(priceElement.OuterXml, priceElement.OuterXml + " \n "); return bookElement;}
Public Function AddNewBook(ByVal genre As String, ByVal ISBN As String, ByVal misc As String, ByVal title As String, ByVal price As String, ByVal doc As XmlDocument) As XmlElement ' Create a new book element. Dim bookElement As XmlElement = doc.CreateElement("book", "http://www.contoso.com/books") ' Create attributes for book and append them to the book element. Dim attribute As XmlAttribute = doc.CreateAttribute("genre") attribute.Value = genre bookElement.Attributes.Append(attribute) attribute = doc.CreateAttribute("ISBN") attribute.Value = ISBN bookElement.Attributes.Append(attribute) attribute = doc.CreateAttribute("publicationdate") attribute.Value = misc bookElement.Attributes.Append(attribute) ' Create and append a child element for the title of the book. Dim titleElement As XmlElement = doc.CreateElement("title") titleElement.InnerText = title bookElement.AppendChild(titleElement) ' Introduce a newline character so that XML is nicely formatted. bookElement.InnerXml = bookElement.InnerXml.Replace(titleElement.OuterXml, _ "\n " & titleElement.OuterXml & " " & ControlChars.NewLine + " ") ' Create and append a child element for the price of the book. Dim priceElement As XmlElement = doc.CreateElement("price") priceElement.InnerText = price bookElement.AppendChild(priceElement) ' Introduce a newline character so that XML is nicely formatted. bookElement.InnerXml = bookElement.InnerXml.Replace(priceElement.OuterXml, (priceElement.OuterXml & " " & ControlChars.NewLine & " ")) Return bookElementEnd Function

For more information, see Inserting Nodes into an XML Document.

Remove nodes

To remove a node, use the RemoveChild method.

This example removes a book from the document and any whitespace that appears just before the book node.

public void deleteBook(XmlNode book){ XmlNode prevNode = book.PreviousSibling; book.OwnerDocument.DocumentElement.RemoveChild(book); if (prevNode.NodeType == XmlNodeType.Whitespace || prevNode.NodeType == XmlNodeType.SignificantWhitespace) { prevNode.OwnerDocument.DocumentElement.RemoveChild(prevNode); }}
Public Sub deleteBook(ByVal book As XmlNode) Dim prevNode As XmlNode = book.PreviousSibling book.OwnerDocument.DocumentElement.RemoveChild(book) If ((prevNode.NodeType = XmlNodeType.Whitespace) _ OrElse (prevNode.NodeType = XmlNodeType.SignificantWhitespace)) Then prevNode.OwnerDocument.DocumentElement.RemoveChild(prevNode) End IfEnd Sub

For more information, see Removing Nodes, Content, and Values from an XML Document.

Position nodes

You can choose where you want a node to appear in your document by using the InsertBefore and InsertAfter methods.

This example shows two helper methods. One of them moves a node higher in a list. The other one moves a node lower.

These methods could be used in an application that enables users to move books up and down in a list of books. When a user chooses a book and presses an up or down button, your code could call methods like these to position the corresponding book node before or after other book nodes.

//************************************************************************************//// Summary: Move elements up in the XML.//////************************************************************************************public void MoveElementUp(XmlNode book){ XmlNode previousNode = book.PreviousSibling; while (previousNode != null && (previousNode.NodeType != XmlNodeType.Element)) { previousNode = previousNode.PreviousSibling; } if (previousNode != null) { XmlNode newLineNode = book.NextSibling; book.OwnerDocument.DocumentElement.RemoveChild(book); if (newLineNode.NodeType == XmlNodeType.Whitespace | newLineNode.NodeType == XmlNodeType.SignificantWhitespace) { newLineNode.OwnerDocument.DocumentElement.RemoveChild(newLineNode); } InsertBookElement((XmlElement)book, Constants.positionAbove, previousNode, false, false); }}//************************************************************************************//// Summary: Move elements down in the XML.//////************************************************************************************public void MoveElementDown(XmlNode book){ // Walk backwards until we find an element - ignore text nodes XmlNode NextNode = book.NextSibling; while (NextNode != null && (NextNode.NodeType != XmlNodeType.Element)) { NextNode = NextNode.NextSibling; } if (NextNode != null) { XmlNode newLineNode = book.PreviousSibling; book.OwnerDocument.DocumentElement.RemoveChild(book); if (newLineNode.NodeType == XmlNodeType.Whitespace | newLineNode.NodeType == XmlNodeType.SignificantWhitespace) { newLineNode.OwnerDocument.DocumentElement.RemoveChild(newLineNode); } InsertBookElement((XmlElement)book, Constants.positionBelow, NextNode, false, false); }}
'************************************************************************************'' Summary: Move elements up in the XML.' ''************************************************************************************Public Sub MoveElementUp(ByVal book As XmlNode) Dim previousNode As XmlNode = book.PreviousSibling While ((Not (previousNode) Is Nothing) _ AndAlso (previousNode.NodeType <> XmlNodeType.Element)) previousNode = previousNode.PreviousSibling End While If (Not (previousNode) Is Nothing) Then Dim newLineNode As XmlNode = book.NextSibling book.OwnerDocument.DocumentElement.RemoveChild(book) If ((newLineNode.NodeType = XmlNodeType.Whitespace) _ Or (newLineNode.NodeType = XmlNodeType.SignificantWhitespace)) Then newLineNode.OwnerDocument.DocumentElement.RemoveChild(newLineNode) End If InsertBookElement(CType(book, XmlElement), Constants.positionAbove, previousNode, False, False) End IfEnd Sub'************************************************************************************'' Summary: Move elements down in the XML.' ''************************************************************************************Public Sub MoveElementDown(ByVal book As XmlNode) ' Walk backwards until we find an element - ignore text nodes Dim NextNode As XmlNode = book.NextSibling While ((Not (NextNode) Is Nothing) _ AndAlso (NextNode.NodeType <> XmlNodeType.Element)) NextNode = NextNode.NextSibling End While If (Not (NextNode) Is Nothing) Then Dim newLineNode As XmlNode = book.PreviousSibling book.OwnerDocument.DocumentElement.RemoveChild(book) If ((newLineNode.NodeType = XmlNodeType.Whitespace) _ Or (newLineNode.NodeType = XmlNodeType.SignificantWhitespace)) Then newLineNode.OwnerDocument.DocumentElement.RemoveChild(newLineNode) End If InsertBookElement(CType(book, XmlElement), Constants.positionBelow, NextNode, False, False) End IfEnd Sub
System.Xml.XmlDocument class - .NET (2024)
Top Articles
Latest Posts
Recommended Articles
Article information

Author: Prof. Nancy Dach

Last Updated:

Views: 6444

Rating: 4.7 / 5 (57 voted)

Reviews: 88% of readers found this page helpful

Author information

Name: Prof. Nancy Dach

Birthday: 1993-08-23

Address: 569 Waelchi Ports, South Blainebury, LA 11589

Phone: +9958996486049

Job: Sales Manager

Hobby: Web surfing, Scuba diving, Mountaineering, Writing, Sailing, Dance, Blacksmithing

Introduction: My name is Prof. Nancy Dach, I am a lively, joyous, courageous, lovely, tender, charming, open person who loves writing and wants to share my knowledge and understanding with you.