web-dev-qa-db-fra.com

Lecture de données à partir de XML

Je prévois d'utiliser XML pour la base de données. La seule chose que j'ai pu faire est de lire le fichier XML en entier. Je veux être capable de lire seulement certaines données et je ne sais pas comment faire ça.

Voici un simple XML

<Books>
 <Book>
  <Title>Animals</Title>
  <Author>J. Anderson</Author>
 </Book>
 <Book>
  <Title>Car</Title>
  <Author>L. Sawer</Author>
 </Book>
</Books> 

Je suis intéressé par l'application où la sortie va être

Books:
Animals
Cars

Authors:
J. Anderson
L. Sawer

Je veux juste apprendre comment lire des données spécifiques à partir de XML pas un fichier complet.

[RESOLU] J'ai utilisé Linq to XML

23
Safiron

Je ne pense pas que vous puissiez "légalement" charger seulement une partie d'un fichier XML, car ce serait alors mal formé (il y aurait un élément de fermeture manquant quelque part).

En utilisant LINQ-to-XML, vous pouvez faire var doc = XDocument.Load("yourfilepath"). À partir de là, il vous suffit d'interroger les données que vous souhaitez, par exemple:

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

HTH.

EDIT:

Ok, juste pour en faire un meilleur échantillon, essayez ceci (avec l'amélioration suggérée par @ 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();
        }
    }
}

Vous devrez ajuster le chemin dans XDocument.Load() pour qu'il pointe vers votre fichier XML, mais le reste devrait fonctionner. Posez des questions sur les parties que vous ne comprenez pas.

48
Tieson T.

selon le commentaire de @Jon Skeet, vous ne devriez utiliser un XmlReader que si votre fichier est très volumineux. Voici comment l'utiliser. En supposant que vous avez un cours de livre

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

vous pouvez lire ligne par ligne le fichier XML avec une petite empreinte mémoire, comme ceci:

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

Exemple d'utilisation:

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);  
}
12
Paolo Falabella

Vous pouvez également utiliser 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();
}
3
Strillo

Essayez la méthode GetElementsByTagName de la classe XMLDocument pour lire des données spécifiques ou la méthode LoadXml pour lire toutes les données dans un document XML.

1
Upendra Chaudhari