New to Telerik UI for WPF? Download free 30-day trial

Using XML

The purpose of this tutorial is to show you how to read data from XML document and use it in the context of your WPF application. The following common tasks will be examined:

  • Deserializing data.

  • Reading data with Linq to XML.

  • Reading data with XMLReader.

Deserializing Data

The most straight-forward way to read data from XML document is to deserialize it using the XmlSerializer class. Here is a sample code showing how this can be achieved:

private XmlNodeItemList RetrieveData() 
{ 
    string xmlDocument = "/DataSource/XmlData.xml"; 
    // 1. Get the resource stream for the file located in the application package. 
    Stream xmlStream = Application.GetResourceStream( new Uri( xmlDocument, UriKind.Relative ) ).Stream; 
    // 1. Get the stream for the file located on the local hard drive. 
    Stream xmlStream = File.Open( xmlDocument, FileMode.Open ); 
    // 2. Create a new instance of the XmlSerializer class. 
    XmlSerializer serializer = new XmlSerializer( typeof( XmlNodeItemList ) ); 
    // 3. Create a new instance of the StreamReader class. 
    StreamReader reader = new StreamReader( xmlStream ); 
    // 4. Deserialize the data 
    XmlNodeItemList list = (XmlNodeItemList)serializer.Deserialize( reader ); 
} 
Private Function RetrieveData() As XmlNodeItemList 
    Dim xmlDocument As String = "/DataSource/XmlData.xml" 
    ' 1. Get the resource stream for the file located in the application package.' 
    Dim xmlStream As Stream = Application.GetResourceStream(New Uri(xmlDocument, UriKind.Relative)).Stream 
    ' 1. Get the stream for the file located on the local hard drive.' 
    Dim xmlStream As Stream = File.Open(xmlDocument, FileMode.Open) 
    ' 2. Create a new instance of the XmlSerializer class.' 
    Dim serializer As New XmlSerializer(GetType(XmlNodeItemList)) 
    ' 3. Create a new instance of the StreamReader class.' 
    Dim reader As New StreamReader(xmlStream) 
    ' 4. Deserialize the data' 
    Dim list As XmlNodeItemList = DirectCast(serializer.Deserialize(reader), XmlNodeItemList) 
End Function 

Reading Data With Linq to XML

Before reading you should load your XML file to an XElement or XDocument object. This can be done with the Load() method. You can input from string, from TextReader, from XMLReader and of course from file:

XDocument myXML = XDocument.Load( "MyXML.xml" ); 
Dim myXML As XDocument = XDocument.Load("MyXML.xml") 

On the next step you can use standard query operators to read the XML. Here is a sample code:

List<Person> personsList =    
( from person in myXml.Descendants( "person" )    
  where (( string )person.Element( "address" ).Attribute( "country" )).Equals( "Bulgaria" ) 
  select new Person() 
  {    
      FirstName = person.Element( "firstName" ).Value, 
      LastName = person.Element( "lastName" ).Value, 
      Address = new Location() 
      {   
          City = person.Element( "address" ).Attribute( "city" ).Value, 
          Country = person.Element( "address" ).Attribute( "country" ).Value 
      }   
  } ).ToList(); 
Dim personsList As List(Of Person) = (From person In myXml.Descendants("person") _ 
    Where DirectCast(person.Element("address").Attribute("country"), String).Equals("Bulgaria") _ 
    Select New Person()).ToList() 

Reading Data with XMLReader

The following example navigates through a stream to determine the current node type, and then uses XmlWriter to output the XmlReader content.

using (XmlReader reader = XmlReader.Create(new StringReader(xmlString))) 
{ 
    XmlWriterSettings ws = new XmlWriterSettings(); 
    ws.Indent = true; 
    using (XmlWriter writer = XmlWriter.Create(output, ws)) 
    { 
        // Parse the file and display each of the nodes. 
        while (reader.Read()) 
        { 
            switch (reader.NodeType) 
            { 
                case XmlNodeType.Element: 
                    writer.WriteStartElement(reader.Name); 
                    break; 
                case XmlNodeType.Text: 
                    writer.WriteString(reader.Value); 
                    break; 
                case XmlNodeType.XmlDeclaration: 
                case XmlNodeType.ProcessingInstruction: 
                    writer.WriteProcessingInstruction(reader.Name, reader.Value); 
                    break; 
                case XmlNodeType.Comment: 
                    writer.WriteComment(reader.Value); 
                    break; 
                case XmlNodeType.EndElement: 
                    writer.WriteFullEndElement(); 
                    break; 
            } 
        } 
    } 
} 
Using reader As XmlReader = XmlReader.Create(New StringReader(xmlString)) 
    Dim ws As New XmlWriterSettings() 
    ws.Indent = True 
    Using writer As XmlWriter = XmlWriter.Create(output, ws) 
 
        ' Parse the file and display each of the nodes.' 
        While reader.Read() 
            Select Case reader.NodeType 
                Case XmlNodeType.Element 
                    writer.WriteStartElement(reader.Name) 
                    Exit Select 
                Case XmlNodeType.Text 
                    writer.WriteString(reader.Value) 
                    Exit Select 
                Case XmlNodeType.XmlDeclaration, XmlNodeType.ProcessingInstruction 
                    writer.WriteProcessingInstruction(reader.Name, reader.Value) 
                    Exit Select 
                Case XmlNodeType.Comment 
                    writer.WriteComment(reader.Value) 
                    Exit Select 
                Case XmlNodeType.EndElement 
                    writer.WriteFullEndElement() 
                    Exit Select 
            End Select 
 
        End While 
    End Using 
End Using 

See Also

In this article