Lettura dei dati da XML

Sto pensando di usare XML per scopi di database. L’unica cosa che sono riuscito a fare è leggere l’intero file XML. Voglio essere in grado di leggere solo alcuni dati e non so come farlo.

Ecco un semplice XML

  Animals J. Anderson   Car L. Sawer   

Mi interessa l’app in cui l’output sarà

 Books: Animals Cars Authors: J. Anderson L. Sawer 

Voglio solo imparare come leggere dati specifici da XML non interi file.

[SOLVED] Ho usato Linq in XML

Non penso che tu possa caricare “legalmente” solo parte di un file XML, poiché in quel caso sarebbe malformato (ci sarebbe un elemento di chiusura mancante da qualche parte).

Usando LINQ-to-XML, puoi fare var doc = XDocument.Load("yourfilepath") . Da lì è solo questione di interrogare i dati che vuoi, dire in questo modo:

 var authors = doc.Root.Elements().Select( x => x.Element("Author") ); 

HTH.

MODIFICARE:

Ok, per fare un esempio migliore, prova questo (con il miglioramento suggerito da @ JWL_):

 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(); } } } 

Dovrai modificare il percorso in XDocument.Load() per puntare al tuo file XML, ma il resto dovrebbe funzionare. Fai domande su quali parti non capisci.

come per il commento di @Jon Skeet, dovresti usare un XmlReader solo se il tuo file è molto grande. Ecco come usarlo. Supponendo che tu abbia una class di libri

 public class Book { public string Title {get; set;} public string Author {get; set;} } 

puoi leggere il file XML riga per riga con un piccolo ingombro di memoria, come questo:

 public static class XmlHelper { public static IEnumerable 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}; } } } } 

Esempio di utilizzo:

 string uri = @"c:\test.xml"; // your big XML file foreach (var book in XmlHelper.StreamBooks(uri)) { Console.WriteLine("Title, Author: {0}, {1}", book.Title, book.Author); } 

In alternativa, è ansible utilizzare 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"); 

..

 ///  /// Gets the string values. ///  /// The description. /// The navigator. /// The xpath. ///  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(); } 

Prova il metodo GetElementsByTagName della class XMLDocument per leggere dati specifici o il metodo LoadXml per leggere tutti i dati nel documento xml.