Comment analyser des fichiers XML? [fermé]

Existe-t-il une méthode simple pour analyser les fichiers XML dans C#? Si oui, quoi?

492
demandé sur John Saunders 2008-09-11 09:04:56

12 réponses

j'utiliserais LINQ à XML si vous êtes dans .NET 3.5 ou plus.

228
répondu Jon Galloway 2018-02-23 15:45:33

c'est très simple. Je sais que ce sont des méthodes standard, mais vous pouvez créer votre propre bibliothèque de traiter beaucoup mieux.

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

aussi, il ya quelques autres méthodes à travailler avec. Par exemple, ici . Et je pense qu'il n'y a pas de meilleure méthode pour faire cela; vous avez toujours besoin de le choisir par vous-même, ce qui est le plus approprié pour vous.

288
répondu Lukas Šalkauskas 2013-06-15 04:15:20

utiliser 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'objets à partir de votre XML et vice versa. Si vous avez peu de restrictions sur votre modèle, vous pouvez même essayer de créer une correspondance directe entre vos classes de modèles et le XML avec les attributs Xml*.

il y a un article introductif sur la sérialisation XML sur MSDN.

Conseil de Performance: la construction d'un XmlSerializer coûte cher. Conservez une référence à votre instance XmlSerializer si vous avez l'intention d'analyser/écrire plusieurs fichiers XML.

44
répondu David Schmitt 2013-06-16 01:22:55

si vous traitez une grande quantité de données (beaucoup de mégaoctets) alors vous voulez utiliser XmlReader pour analyser le XML.

autre chose ( XPathNavigator , XElement , XmlDocument et même XmlSerializer si vous gardez la totalité du graphe d'objet généré) résultera en haute utilisation de la mémoire et aussi un temps de charge très lent.

bien sûr, si vous avez besoin de toutes les données en mémoire de toute façon, alors vous ne pouvez pas avoir beaucoup choix.

22
répondu Simon Steele 2017-05-23 12:02:49

Utilisation XmlTextReader , XmlReader , XmlNodeReader et le System.Xml.XPath espace de noms. Et ( XPathNavigator , XPathDocument , XPathExpression , XPathnodeIterator ).

habituellement XPath rend la lecture XML plus facile, qui est ce que vous pourriez être à la recherche pour.

15
répondu Vinko Vrsalovic 2013-06-16 01:21:32

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

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

6
répondu Ash 2013-06-16 01:22:24

Je ne suis pas sûr qu'il existe une" pratique exemplaire d'analyse XML". 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 à XML , XmlReader , XPathNavigator ou même des expressions régulières. Si vous développez vos besoins, je peux essayer de donner quelques suggestions.

5
répondu aku 2013-06-16 01:21:51

on m'a récemment demandé de travailler sur une application qui impliquait l'analyse d'un document XML et je suis d'accord avec Jon Galloway pour dire que L'approche LINQ to XML est, à mon avis, la meilleure. J'ai cependant dû creuser un peu pour trouver des exemples utilisables, donc sans plus attendre, en voici quelques-uns!

tous les commentaires sont les bienvenus car ce code fonctionne mais peut ne pas être parfait et je voudrais en savoir plus sur l'analyse XML pour ce projet!

public void ParseXML(string 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<XElement> 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 attribute from an element
    XAttribute attribute = element.Attribute("exampleAttributeName");
}

Avec ces fonctions, j'ai été capable d'analyser n'importe quel élément et d'attribut à partir d'un fichier XML aucun problème!

5
répondu PJRobot 2018-03-23 11:09:28

vous pouvez analyser le XML en utilisant cette bibliothèque System.Xml.Linq . Ci-dessous est le code échantillon que j'ai utilisé pour analyser un fichier XML

public CatSubCatList GenerateCategoryListFromProductFeedXML()
{
    string path = System.Web.HttpContext.Current.Server.MapPath(_xmlFilePath);

    XDocument xDoc = XDocument.Load(path);

    XElement xElement = XElement.Parse(xDoc.ToString());


    List<Category> lstCategory = xElement.Elements("Product").Select(d => new Category
    {
        Code = Convert.ToString(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;
}
2
répondu Tapan kumar 2017-07-19 19:05:59

en outre, vous pouvez utiliser le sélecteur XPath de la manière suivante (manière facile de sélectionner des noeuds 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 attribute title with value 'Barry Poter'

// Retrieve 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

2
répondu Joel Harkes 2017-10-17 12:19:38

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<Message>(xml);

Serializer XML Standard dans .NET est très limité.

  • Ne prend pas en charge la sérialisation de la classe avec la circulaire de référence de la classe ou de l'interface de la propriété,
  • 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 serializer personnalisé, votre classe doit hériter de Ixmlserialisable. Cela signifie que votre classe ne sera pas a POCO class,
  • ne soutient pas le CIO.

ExtendedXmlSerializer pouvez faire cela et beaucoup plus.

ExtendedXmlSerializer support .NET 4.5 ou plus et .net Core . Vous pouvez l'intégrer avec WebApi et AspCore.

0
répondu Wojtpl2 2017-02-16 14:26:33

vous pouvez utiliser XmlDocument et pour manipuler ou récupérer des données à partir d'attributs que vous pouvez Linq à des classes XML.

0
répondu shaishav shukla 2017-11-16 12:27:26