Question Comment analyser les fichiers XML? [fermé]


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


492
2017-09-11 05:04


origine


Réponses:


J'utiliserais LINQ à XML si vous êtes en .NET 3.5 ou supérieur.


227
2017-09-11 05:05



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

Il y a aussi des Autres méthodes travailler avec. Par exemple, ici. Et je pense qu'il n'y a pas de meilleure méthode pour cela; vous devez toujours le choisir vous-même, ce qui vous convient le mieux.


285
2017-09-11 05:17



Utilisez un bon XSD Schema 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 un mappage direct entre vos classes de modèle et le XML avec les attributs Xml *.

Il y a un article d'introduction sur la sérialisation XML sur MSDN.

Astuce de performance: Construire un XmlSerializer est cher. Gardez une référence à votre XmlSerializer instance si vous avez l'intention d'analyser / écrire plusieurs fichiers XML.


44
2017-09-11 06:16



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

Rien d'autre (XPathNavigator, XElement, XmlDocument et même XmlSerializer si vous conservez le graphique de l'objet généré complet) utilisation de mémoire élevée et aussi 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.


22
2017-09-11 07:48



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

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


15
2017-09-11 05:12



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.), vers l'avant seulement pour analyser un fichier XML.

Si tu as besoin XPath capacités, essayez le XPathNavigator. Si vous avez besoin de tout le document en mémoire, essayez XmlDocument.


6
2017-09-11 05:12



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

Tu peux 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.


5
2017-09-11 05:11



J'ai récemment été amené à travailler sur une application qui impliquait l'analyse d'un document XML et je suis d'accord avec Jon Galloway 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'analyse XML de 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 pu analyser n'importe quel élément et n'importe quel attribut d'un fichier XML sans aucun problème!


3
2018-02-23 15:38



Vous pouvez analyser le XML en utilisant cette bibliothèque System.Xml.Linq. Voici l'exemple de code 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
2017-07-18 20:41



En outre, vous pouvez utiliser le sélecteur XPath de la manière suivante (manière 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 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


1
2017-10-17 12:19