Comment parsing-t-on les fichiers XML?

Existe-t-il une méthode simple d’parsing des fichiers XML en C #? Si oui, quoi?

J’utiliserais LINQ to XML si vous êtes dans .NET 3.5 ou supérieur.

C’est très simple. Je sais que ce sont des méthodes standard, mais vous pouvez créer votre propre bibliothèque pour mieux gérer cela.

Voici quelques exemples:

XmlDocument xmlDoc= new XmlDocument(); // Create an XML document object xmlDoc.Load("yourXMLFile.xml"); // Load the XML document from the specified file // Get elements XmlNodeList girlAddress = xmlDoc.GetElementsByTagName("gAddress"); XmlNodeList girlAge = xmlDoc.GetElementsByTagName("gAge"); XmlNodeList girlCellPhoneNumber = xmlDoc.GetElementsByTagName("gPhone"); // Display the results Console.WriteLine("Address: " + girlAddress[0].InnerText); Console.WriteLine("Age: " + girlAge[0].InnerText); Console.WriteLine("Phone Number: " + girlCellPhoneNumber[0].InnerText); 

En outre, il existe d’ autres méthodes avec lesquelles travailler. Par exemple, ici . Et je pense qu’il n’y a pas une meilleure méthode pour le faire; vous devez toujours le choisir par vous-même, ce qui vous convient le mieux.

Utilisez un bon schéma XSD pour créer un ensemble de classes avec xsd.exe et utilisez un XmlSerializer pour créer un arbre d’objects à partir de votre XML et inversement. Si vous avez peu de ressortingctions sur votre modèle, vous pouvez même essayer de créer un mappage direct entre vos classes de modèle et le XML avec les atsortingbuts Xml *.

Il existe un article d’introduction sur la sérialisation XML sur MSDN.

Astuce de performance: la construction d’un XmlSerializer est coûteuse. Conservez une référence à votre instance XmlSerializer si vous souhaitez parsingr / écrire plusieurs fichiers XML.

Si vous traitez une grande quantité de données (plusieurs mégaoctets), vous souhaitez utiliser XmlReader pour parsingr le XML.

Toute autre chose ( XPathNavigator , XElement , XmlDocument et même XmlSerializer si vous conservez le graphe d’object généré complet) entraînera une utilisation élevée de la mémoire et également un temps de chargement très lent.

Bien sûr, si vous avez besoin de toutes les données en mémoire, vous n’avez pas beaucoup de choix.

Utilisez XmlTextReader , XmlReader , XmlNodeReader et l’espace de noms System.Xml.XPath . Et ( XPathNavigator , XPathDocument , XPathExpression , XPathnodeIterator ).

Habituellement, XPath facilite la lecture de XML, ce que vous recherchez peut-être.

Si vous utilisez .NET 2.0, essayez XmlReader et ses sous-classes XmlTextReader et XmlValidatingReader . Ils fournissent un moyen rapide, léger (utilisation de la mémoire, etc.) pour parsingr un fichier XML.

Si vous avez besoin XPath fonctionnalités XPath , essayez le XPathNavigator . Si vous avez besoin du document entier en mémoire, essayez XmlDocument .

Je ne suis pas sûr que les “meilleures pratiques pour l’parsing XML” existent. Il existe de nombreuses technologies adaptées à différentes situations. La manière d’utiliser dépend du scénario concret.

Vous pouvez aller avec LINQ to XML , XmlReader , XPathNavigator ou même des expressions régulières. Si vous élaborez vos besoins, je peux essayer de donner quelques suggestions.

Récemment, j’ai dû travailler sur une application impliquant l’parsing d’un document XML et je suis d’accord avec Jon Galloway pour dire que l’approche basée sur LINQ to XML est, à mon avis, la meilleure. J’ai cependant dû creuser un peu pour trouver des exemples utilisables, alors sans plus tarder, en voici quelques-uns!

Tous les commentaires sont les bienvenus, car ce code fonctionne mais peut-être pas parfait et j’aimerais en savoir plus sur l’parsing XML de ce projet!

 public void ParseXML(ssortingng filePath) { // create document instance using XML file path XDocument doc = XDocument.Load(filePath); // get the namespace to that within of the XML (xmlns="...") XElement root = doc.Root; XNamespace ns = root.GetDefaultNamespace(); // obtain a list of elements with specific tag IEnumerable elements = from c in doc.Descendants(ns + "exampleTagName") select c; // obtain a single element with specific tag (first instance), useful if only expecting one instance of the tag in the target doc XElement element = (from c in doc.Descendants(ns + "exampleTagName" select c).First(); // obtain an element from within an element, same as from doc XElement embeddedElement = (from c in element.Descendants(ns + "exampleEmbeddedTagName" select c).First(); // obtain an atsortingbute from an element XAtsortingbute atsortingbute = element.Atsortingbute("exampleAtsortingbuteName"); } 

Avec ces fonctions, j’ai pu parsingr n’importe quel élément et n’importe quel atsortingbut d’un fichier XML sans aucun problème!

Vous pouvez parsingr le code XML en utilisant cette bibliothèque System.Xml.Linq . Voici l’exemple de code que j’ai utilisé pour parsingr un fichier XML

 public CatSubCatList GenerateCategoryListFromProductFeedXML() { ssortingng path = System.Web.HttpContext.Current.Server.MapPath(_xmlFilePath); XDocument xDoc = XDocument.Load(path); XElement xElement = XElement.Parse(xDoc.ToSsortingng()); List lstCategory = xElement.Elements("Product").Select(d => new Category { Code = Convert.ToSsortingng(d.Element("CategoryCode").Value), CategoryPath = d.Element("CategoryPath").Value, Name = GetCateOrSubCategory(d.Element("CategoryPath").Value, 0), // Category SubCategoryName = GetCateOrSubCategory(d.Element("CategoryPath").Value, 1) // Sub Category }).GroupBy(x => new { x.Code, x.SubCategoryName }).Select(x => x.First()).ToList(); CatSubCatList catSubCatList = GetFinalCategoryListFromXML(lstCategory); return catSubCatList; } 

De plus, vous pouvez utiliser le sélecteur XPath de la manière suivante (moyen simple de sélectionner des nœuds spécifiques):

 XmlDocument doc = new XmlDocument(); doc.Load("test.xml"); var found = doc.DocumentElement.SelectNodes("//book[@title='Barry Poter']"); // select all Book elements in whole dom, with atsortingbute title with value 'Barry Poter' // Resortingeve your data here or change XML here: foreach (XmlNode book in nodeList) { book.InnerText="The story began as it was..."; } Console.WriteLine("Display XML:"); doc.Save(Console.Out); 

La documentation

Vous pouvez utiliser ExtendedXmlSerializer pour sérialiser et désérialiser.

Instalation Vous pouvez installer ExtendedXmlSerializer à partir de nuget ou exécuter la commande suivante:

 Install-Package ExtendedXmlSerializer 

Sérialisation:

 ExtendedXmlSerializer serializer = new ExtendedXmlSerializer(); var obj = new Message(); var xml = serializer.Serialize(obj); 

Désérialisation

 var obj2 = serializer.Deserialize(xml); 

Le sérialiseur XML standard dans .NET est très limité.

  • Ne prend pas en charge la sérialisation de la classe avec une référence circulaire ou une classe avec une propriété d’interface,
  • Ne supporte pas les dictionnaires,
  • Il n’y a pas de mécanisme pour lire l’ancienne version de XML,
  • Si vous voulez créer un sérialiseur personnalisé, votre classe doit hériter de IXmlSerializable. Cela signifie que votre classe ne sera pas une classe POCO,
  • Ne supporte pas l’IoC.

ExtendedXmlSerializer peut le faire et bien plus encore.

ExtendedXmlSerializer prend en charge .NET 4.5 ou supérieur et .NET Core . Vous pouvez l’intégrer avec WebApi et AspCore.

Vous pouvez utiliser XmlDocument et pour manipuler ou récupérer des données à partir d’atsortingbuts que vous pouvez classer en classes XML.