Reading data from XML [duplicate]
I don't think you can "legally" load only part of an XML file, since then it would be malformed (there would be a missing closing element somewhere).
Using LINQ-to-XML, you can do var doc = XDocument.Load("yourfilepath")
. From there its just a matter of querying the data you want, say like this:
var authors = doc.Root.Elements().Select( x => x.Element("Author") );
HTH.
EDIT:
Okay, just to make this a better sample, try this (with @JWL_'s suggested improvement):
using System;using System.Xml.Linq;namespace ConsoleApplication1 { class Program { static void Main( string[] args ) { XDocument doc = XDocument.Load( "XMLFile1.xml" ); var authors = doc.Descendants( "Author" ); foreach ( var author in authors ) { Console.WriteLine( author.Value ); } Console.ReadLine(); } }}
You will need to adjust the path in XDocument.Load()
to point to your XML file, but the rest should work. Ask questions about which parts you don't understand.
as per @Jon Skeet 's comment, you should use a XmlReader only if your file is very big. Here's how to use it.Assuming you have a Book class
public class Book { public string Title {get; set;} public string Author {get; set;}}
you can read the XML file line by line with a small memory footprint, like this:
public static class XmlHelper { public static IEnumerable<Book> StreamBooks(string uri) { using (XmlReader reader = XmlReader.Create(uri)) { string title = null; string author = null; reader.MoveToContent(); while (reader.Read()) { if (reader.NodeType == XmlNodeType.Element && reader.Name == "Book") { while (reader.Read()) { if (reader.NodeType == XmlNodeType.Element && reader.Name == "Title") { title = reader.ReadString(); break; } } while (reader.Read()) { if (reader.NodeType == XmlNodeType.Element && reader.Name == "Author") { author =reader.ReadString(); break; } } yield return new Book() {Title = title, Author = author}; } } } }
Example of usage:
string uri = @"c:\test.xml"; // your big XML fileforeach (var book in XmlHelper.StreamBooks(uri)) { Console.WriteLine("Title, Author: {0}, {1}", book.Title, book.Author); }
Alternatively, you can use XPathNavigator:
XmlDocument doc = new XmlDocument();doc.LoadXml(xml);XPathNavigator navigator = doc.CreateNavigator();string books = GetStringValues("Books: ", navigator, "//Book/Title");string authors = GetStringValues("Authors: ", navigator, "//Book/Author");
..
/// <summary>/// Gets the string values./// </summary>/// <param name="description">The description.</param>/// <param name="navigator">The navigator.</param>/// <param name="xpath">The xpath.</param>/// <returns></returns>private static string GetStringValues(string description, XPathNavigator navigator, string xpath) { StringBuilder sb = new StringBuilder(); sb.Append(description); XPathNodeIterator bookNodesIterator = navigator.Select(xpath); while (bookNodesIterator.MoveNext()) sb.Append(string.Format("{0} ", bookNodesIterator.Current.Value)); return sb.ToString();}