Click here to Skip to main content
15,881,828 members
Articles / Web Development / ASP.NET

XML Literals

Rate me:
Please Sign up or sign in to vote.
4.85/5 (37 votes)
12 Apr 2010CPOL5 min read 111.1K   77   39
XML Literals allow you to use XML syntax in your code. It’s easy to work with XML files this way, since you have that Tags in the code, but it’s also quicker to access information rather than the traditional methods.

This is an English version of some articles I posted a while ago in my blog. XML Literals are a great way to handle XML files and the community doesn't use it as much as it should.

xmlliterals0.jpg

Introduction

XML Literals allow you to use XML syntax in your code. It’s easy to work with XML files this way, since you have that Tag in the code, but it’s also quicker to access information rather than the traditional methods using XmlDocument and XmlElement. It’s available in the namespace System.Xml.Linq, since the .NET Framework 3.5/Visual Studio 2008 (for Visual Basic Only) supports most of the Extensible Markup Language (XML) 1.0 specification, and together with Lambda Expressions and/or LINQ, gives you a better experience with XML files. It’s also available in the intellisense, and it automatically indents the code.

XML Literals

NOTE: Most of the examples use Option Infer On but you can declare the correct variables data type.

The basic concept looks like this:

VB.NET
Dim msg = <msg> 
              This is a test! 
              This is a test! 
          </msg>.Value 
MessageBox.Show(msg, "XML Literals")

This will show you a MessageBox, preserving the spaces, tabs and page breaks. Notice that it doesn't need the line continuation character “_” (which will not even be necessary in Visual Studio 2010 for most of the code).

Image 2

You can create your XML file in runtime mode. Here’s an example of how to achieve that:

VB.NET
Dim bookList = _ 
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
    <!-- List of books and magazines --> 
    <library> 
        <books> 
            <book name="The Hunger Games " author="Suzanne Collins"/> 
            <book name="Breaking Dawn" author="Stephenie Meyer"/> 
            <book name="The Last Song" author="Nicholas Sparks"/> 
        </books> 
        <magazine> 
            <magazineName>"MSDN Magazine"</magazineName> 
            <magazineName>"Code Magazine"</magazineName> 
        </magazine> 
    </library>

The variable bookList is now an XDocument that you can work as an XML file. To save the file on the disk, you just need to use the Save() method:

VB.NET
bookList.Save("c:\library.xml")

Read Information

The previous example generates an easy XML file and saves it to disk. To load the file and handle it, you can use the Load() event. This will load the file and show the magazine name, using the Descendants property, which allow access to descendant nodes by name from an XElement or XDocument object:

VB.NET
Dim xmlFile = XDocument.Load("c:\library.xml") 
Debug.WriteLine(xmlFile...<magazineName>.Value)

This will show in the Immediate Window “MSDN Magazine” because it’s the first name that it found. We can also get the second magazine (in this case), using Lambda Expressions:

VB.NET
Dim xmlFile = XDocument.Load("c:\library.xml") 
Debug.WriteLine(xmlFile...<magazineName>.Where(Function(f) _ 
                               f.Value = "Code Magazine").Value)

This is for “regular” node elements but if you need to show attributes, then you should use the following syntax:

VB.NET
Dim xmlFile = XDocument.Load("c:\library.xml") 
Debug.WriteLine(xmlFile...<book>.@author) 

And for the Lambda Expression to filter for a specific value (this will search on the book name and show the author name):

VB.NET
Dim xmlFile = XDocument.Load("c:\library.xml") 
Debug.WriteLine(xmlFile...<book>.Where(Function(f) _ 
                                 f.@name = "Breaking Dawn").@author)

List Information

You have several ways to show information, looping on the values, using LINQ to XML or Lambda Expressions. You can list all the magazines this way:

VB.NET
For Each m In From element In bookList.<library>.<magazine>.<magazineName> 
   Debug.WriteLine(m.Value) 
Next 

You can also use the Descendants property and significantly simplify the code:

VB.NET
For Each m In From element In bookList...<magazineName> 
    Debug.WriteLine(m.Value) 
Next 

To show the book names you can use the same method, but since you now deal with attributes, you use the “@” to define that you want the attribute, plus the attribute name.

VB.NET
For Each book In From element In bookList...<book> 
    Debug.WriteLine("Book: " & book.@name.ToString) 
    Debug.WriteLine("Author: " & book.@author.ToString) 
    ' Separation line 
    Debug.WriteLine(New String("-"c, 40)) 
Next 

But you can also filter the information before showing it. This example uses LINQ to XML to check all of the books that have a name containing the keyword “Song”.

VB.NET
' Using LINQ to XML to filter the information 
Dim bookSearch = From b In bookList...<book> _ 
         Where b.@name.ToString.Contains("Song") _ 
         Select b.@name, b.@author 

' Show the results 
For Each book In From element In bookSearch 
    Debug.WriteLine("Book: " & book.name) 
    Debug.WriteLine("Author: " & book.author)     

    ' Separation line 
    Debug.WriteLine(New String("-"c, 40)) 
Next 

Embedded Expressions

Embedded expressions are expressions that you can use in the XML code, using the tags <%= expression %>, like it’s available in ASP.NET. You can use them to build or modify the XML file and that makes it really easy to create a file from a DataTable, List(Of T), Dictionary, etc.

Here’s a very straight forward example, using a Func() delegate (Lambda Expression) that adds two values:

VB.NET
Dim f As Func(Of Integer, Integer, Integer) = Function(x, y) x + y 

Dim example = _ 
    <test> 
        <value><%= f(125, 125).ToString() %></value > 
    </test>

The result will be:

XML
<test> 
     <value>250</value> 
</test> 

If you have another datasource, like a List(Of T), you can list all the values, using embedded expressions, to an XML file:

VB.NET
' Creates a list with some book names  
Dim bookList As New List(Of String) 
bookList.AddRange(New String() {"The Hunger Games", "Breaking Dawn", "The Last Song"}) 

' Creates the XML e saves it to disk 
Dim newBookList1 = _ 
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
    <library> 
        <books> 
            <%= From b In bookList Select <book><%= b %></book> %> 
        </books> 
    </library> 

newBookList1.Save("c:\result.xml")

This will be the result:

XML
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
  <library>
     <books>
           <book>The Hunger Games</book>
           <book>Breaking Dawn</book>
           <book>The Last Song</book>
     </books>
</library>

Another example of using embedded expressions is using a DataTable. In this case, it will create an XML file with the attributes “name” and “author”:

VB.NET
' For this example is created a DataTable manually but 
' could be the result of a SQL query or stored procedure 
Dim dt As New DataTable("Books") 
dt.Columns.Add("Book", GetType(String)) 
dt.Columns.Add("Author", GetType(String)) 
dt.Rows.Add("The Hunger Games", "Suzanne Collins") 
dt.Rows.Add("Breaking Dawn", "Stephenie Meyer") 
dt.Rows.Add("The Last Song", "Nicholas Sparks") 
Dim ds As New DataSet 
ds.Tables.Add(dt) 

' Creates the XML e with two attributes: "name" and "author"  
Dim newBookList2 = _ 
   <?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
   <!-- my book list --> 
   <library> 
       <books> 
           <%= From b In ds.Tables("Books") Select _ 
               <book name=<%= b.Item("Book") %> 
                   author=<%= b.Item("Author") %>/> %> 
       </books> 
   </library> 

' Saves it to disk 
newBookList2.Save("c:\library.xml") 

This will be the result:

XML
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<library>
        <books>
            <book name=" The Hunger Games" author="Suzanne Collins" />
            <book name=" Breaking Dawn" author="Stephanie Meyer" />
            <book name=" The Last Song" author="Nicholas Sparks" />
        </books>
</library>

Modify Nodes

To modify any information in an XML file, using XML Literals, you just need to read the file, change the value and then save it to disk.

Here’s an example:

VB.NET
Dim xmlFile = XDocument.Load("c:\library.xml") 
xmlFile...<magazineName>.Value = "New Value" 
xmlFile.Save("c:\library.xml")

But using this approach, only the first value that is found will be changed. If you need to change a specific value, like you normally do, you need to filter the information first to indicate what value to change:

VB.NET
Dim xmlFile = XDocument.Load("c:\library.xml") 
Dim element = xmlFile.<library>.<books>.<book>.Where(Function(f) _ 
                             f.@name = "The Last Song") 
element.@author = "Jorge Paulino" 
xmlFile.Save("c:\library.xml")

This will change the name of the author for the book “The Last Song”, from “Nicholas Sparks” to “Jorge Paulino” (that was nice!). But once again, using the Descendants property saves you some code:

VB.NET
Dim xmlFile = XDocument.Load("c:\library.xml") 
xmlFile...<book>.Where(Function(f) _ 
                f.@name = "The Last Song").@author = "Jorge Paulino" 
xmlFile.Save("c:\library.xml") 

Inserting Nodes

To insert a new node into the XML file, you first need to build the new element (XElement) and then add it to the right position. We can do that in two ways:

VB.NET
Dim xmlFile = XDocument.Load("c:\library.xml") 
Dim element = New XElement("book", _ 
                    New XAttribute("name", "XML Literals"), _ 
                    New XAttribute("author", "Jorge Paulino")) 
Dim parent = xmlFile...<books>.FirstOrDefault() 
parent.Add(element) 
xmlFile.Save("c:\library.xml")

Or, the easy way:

VB.NET
Dim xmlFile = XDocument.Load("c:\library.xml") 
Dim element = <book name="XML Literals" author="Jorge Paulino"/> 
Dim parent = xmlFile...<books>.FirstOrDefault() 
parent.Add(element) 
xmlFile.Save("c:\library.xml")

In this example, we can change the values of the attributes dynamically, using embedded expressions like we saw before.

Deleting Nodes

Deleting a node is very similar to the modification method. You can remove all the nodes:

VB.NET
Dim xmlFile = XDocument.Load("c:\library.xml") 
xmlFile...<magazineName>.Remove() 
xmlFile.Save("c:\library.xml")

Or remove a specific node:

VB.NET
Dim xmlFile = XDocument.Load("c:\library.xml") 
xmlFile...<book>.Where(Function(f) f.@author = "Suzanne Collins").Remove() 
xmlFile.Save("c:\library.xml")

Finally Example (web)

You can also use XML Literals to read information from the web, like RSS. This example reads my personal blog RSS and filters by the “VB.NET” category (that is defined by the tags). This show how powerful and easy it is to work with XML Literals.

VB.NET
Dim xmlFile = XDocument.Load("http://feeds.feedburner.com/vbtuga")</a /> 
Dim blogList = xmlFile...<item>.Where(Function(f) _ 
                f.<category>.Value = "VB.NET").<title>.ToList() 
For Each item As XElement In blogList 
    Console.WriteLine(item.Value) 
Next 
Console.ReadKey() 

And the console result:

xmlliterals2.jpg

Conclusion

XML literals provide several methods to work with XML files. Today, you have XML files for everything (reports, configurations, data storage, RSS, etc.) and it’s so important to handle it right, fast and in a easy way.

I hope this article helps you to become better with XML Literals, and use them more!

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer
Portugal Portugal
Jorge Paulino
Microsoft Visual Basic MVP
Portuguese Software Developer
VB.NET, ASP.NET, VBA, SQL
http://vbtuga.blogspot.com/

http://twitter.com/vbtuga

Comments and Discussions

 
QuestionAwesome! Pin
Member 13480306-Feb-13 1:32
Member 13480306-Feb-13 1:32 
GeneralMy vote of 1 Pin
GangadharaRao1-Feb-13 1:44
GangadharaRao1-Feb-13 1:44 
GeneralMy vote of 5 Pin
Savalia Manoj M2-Jan-13 17:52
Savalia Manoj M2-Jan-13 17:52 
GeneralMy vote of 5 Pin
rctaubert29-Mar-12 8:57
rctaubert29-Mar-12 8:57 
QuestionReal World xml Files Pin
rctaubert29-Mar-12 7:23
rctaubert29-Mar-12 7:23 
Great article and even greater information.

I thought this was going to be just what I needed for a project I am working on.

I can get each of your examples to work but when I try to use a real-world xml file returned from a web site query it fails.

There are no error messages, just empty reponses.

I know I am not giving you a lot to go on here but perhaps you can suggest something for me to look at.

The real-world xml files are very much larger than your samples but other than that I can't see any difference that would make them fail.

I have been trying everything I can think of for the last two days with no luck.
AnswerRe: Real World xml Files Pin
jpaulino29-Mar-12 7:38
jpaulino29-Mar-12 7:38 
GeneralRe: Real World xml Files Pin
rctaubert29-Mar-12 8:49
rctaubert29-Mar-12 8:49 
GeneralRe: Real World xml Files Pin
rctaubert29-Mar-12 8:57
rctaubert29-Mar-12 8:57 
GeneralRe: Real World xml Files Pin
jpaulino29-Mar-12 9:48
jpaulino29-Mar-12 9:48 
Generalthats what happened with me Pin
Xmen Real 30-Dec-10 15:24
professional Xmen Real 30-Dec-10 15:24 
GeneralCongrats and small question Pin
Wayne Gaylard3-Jun-10 1:49
professionalWayne Gaylard3-Jun-10 1:49 
GeneralRe: Congrats and small question Pin
jpaulino3-Jun-10 2:00
jpaulino3-Jun-10 2:00 
GeneralRe: Congrats and small question Pin
Wayne Gaylard3-Jun-10 2:13
professionalWayne Gaylard3-Jun-10 2:13 
Generalvery nice article Pin
Thanigainathan.S1-Jun-10 3:45
Thanigainathan.S1-Jun-10 3:45 
GeneralRe: very nice article Pin
jpaulino2-Jun-10 10:27
jpaulino2-Jun-10 10:27 
GeneralNice to see you won again Pin
Marcelo Ricardo de Oliveira31-May-10 15:05
Marcelo Ricardo de Oliveira31-May-10 15:05 
GeneralRe: Nice to see you won again Pin
jpaulino31-May-10 20:29
jpaulino31-May-10 20:29 
GeneralWorkaround for C# Xml Literals Pin
Jaime Olivares31-May-10 10:15
Jaime Olivares31-May-10 10:15 
GeneralRe: Workaround for C# Xml Literals Pin
jpaulino31-May-10 12:51
jpaulino31-May-10 12:51 
GeneralXML literals for SQL statements Pin
karenpayne21-Apr-10 3:38
karenpayne21-Apr-10 3:38 
GeneralRe: XML literals for SQL statements Pin
jpaulino22-Apr-10 21:26
jpaulino22-Apr-10 21:26 
GeneralRe: XML literals for SQL statements Pin
karenpayne23-Apr-10 4:23
karenpayne23-Apr-10 4:23 
GeneralRe: XML literals for SQL statements Pin
jpaulino23-Apr-10 4:35
jpaulino23-Apr-10 4:35 
GeneralThanks for the tips Pin
Wayne Gaylard15-Apr-10 3:52
professionalWayne Gaylard15-Apr-10 3:52 
GeneralRe: Thanks for the tips Pin
jpaulino15-Apr-10 9:11
jpaulino15-Apr-10 9:11 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.