Marcher un arbre XML en C #
Je suis nouveau .net et c#, donc je veux m'assurer que je suis en utilisant le bon outil pour le travail.
Le XML que je reçois est une description de l'arborescence des répertoires sur une autre machine, de sorte qu'il aller sur plusieurs niveaux de profondeur. Ce que je dois faire maintenant est de prendre le XML et créer une structure d'objets (classes personnalisées) et les remplir avec des informations à partir de l'entrée XML, comme des Fichiers, des Dossiers, des Tags, de la Propriété...
L'Arbre stucture de cette entrée XML en fait, dans mon esprit, un candidat de choix pour l'utilisation de la récursivité à pied de l'arbre.
Est-il une autre façon de le faire .net 3.5?
J'ai regardé XmlReaders, mais ils semblent être au pied de l'arbre dans un mode linéaire, pas vraiment ce que je suis à la recherche de...
Le XML que je reçois est une partie d'un 3ème partie de l'api, donc c'est hors de mon contrôle, et peut changer dans l'avenir.
J'ai regardé dans la Désérialisation, mais c'est des lacunes (la boîte noire de la mise en œuvre, la nécessité de déclarer les membres du public, lent, ne fonctionne que pour de simples objets...) le retire de la liste.
Merci pour vos commentaires sur cette.
source d'informationauteur slither
Vous devez vous connecter pour publier un commentaire.
Je voudrais utiliser le XLINQ classes dans le Système.Xml.Linq (c'est l'espace de noms et le montage, vous aurez besoin de référence). De charger le XML et XDocument:
Ensuite, vous pouvez soit utiliser la récursivité ou un pseudo-récursivité boucle pour parcourir les nœuds enfants. Vous pouvez choisir vous nœuds enfants comme:
Les variables directoryElements et fileElements sera IEnumerable types, ce qui signifie que vous pouvez utiliser quelque chose comme un foreach pour parcourir l'ensemble des éléments. Un moyen de construire des éléments serait quelque chose comme ceci:
Dans l'exemple, MyFileType est un type que vous avez créé pour représenter les fichiers. C'est un peu une attaque par force brute, mais il va faire le travail.
Si vous souhaitez utiliser XPath vous aurez besoin de à l'aide de Système.Xml.XPath.
Une Note sur System.Xml vs Système.Xml.Linq
Il y a un certain nombre de classes XML qui ont été dans .Net depuis la 1.0 jours. Ces live (pour la plupart) dans System.Xml. Dans .Net 3.5, un merveilleux nouvel ensemble de classes XML ont été libérés en vertu du Système.Xml.Linq. Je ne peux pas trop insister sur la façon dont beaucoup plus agréable qu'ils sont à travailler que les anciennes classes dans System.Xml. Je les recommande fortement à tout .Net programmeur et surtout quelqu'un vient d'entrer dans .Net/C#.
XmlReader n'est pas particulièrement respectueux de l'API. Si vous pouvez utiliser .NET 3.5, puis de le charger dans LINQ to XML est susceptible d'être votre meilleur pari. Vous pouvez facilement utiliser la récursivité.
Sinon, XmlDocument serait encore faire l'affaire... juste un peu moins agréablement.
C'est un problème qui est très approprié pour la récursivité.
D'élaborer un peu plus sur ce que l'autre affiche dit, vous aurez envie de commencer par le chargement d'un document XML dans une Système.Xml.XmlDocument(à l'aide de LoadXml ou Charge).
Vous pouvez accéder à la racine de l'arbre à l'aide de la XmlDocument.DocumentElement de propriété, d'accès et les enfants de chaque nœud à l'aide de la propriété ChildNodes. Les nœuds enfants renvoie une collection, et lorsque le recouvrement est de taille 0, vous savez que vous aurez atteint votre base de cas.
À l'aide de LINQ est également une bonne option, mais je ne suis pas en mesure de donner des précisions sur cette solution, car je ne suis pas vraiment une LINQ expert.
Que Jon a mentionné, XmlReader n'est pas très sympathique. Si vous finissez par avoir de la perf des questions, vous voudrez peut-être regarder en elle, mais si vous voulez juste pour obtenir le travail fait, aller avec XmlDocument/ChildNodes en utilisant la récursivité.
Chargez votre document XML dans un XMLDocument. Vous pouvez ensuite marcher le XMLDocuments DOM utilisant la récursivité.
Vous pouvez aussi rechercher dans l'usine de la méthode de modèle pour créer vos classes, serait très utile ici.