J'ai une chaîne qui contient un XML bien formé. Je veux parcourir le XML dans cette chaîne pour extraire le texte dans certains nœuds. Comment puis-je accomplir efficacement cela en utilisant une classe intégrée .NET. Quelle classe .NET XML utiliseriez-vous et pourquoi? p>
Merci beaucoup pour votre aide. P>
Note 1: Linq n'est pas disponible pour moi. Note 2: La modification du XML n'est pas importante. L'accès en lecture seule est ce dont j'ai besoin. P>
4 Réponses :
J'utiliserais xmldocument .Charger () pour obtenir un DOM de la chaîne. Ensuite, vous pouvez le traverser en utilisant les méthodes DOM appropriées ou XPath au besoin. P>
Cela dépend de la structure de XML. S'il est relativement simple, alors le moyen le plus efficace d'envelopper la chaîne dans Si la structure du document est suffisamment compliquée, vous pourriez avoir besoin (ou souhaitez) un dom - dans quel cas stringreader code>, puis enveloppez-le dans xmlreader code>. La prestation est que vous n'aurez pas à créer un arborescence XML en mémoire, de copier des données de la chaîne - vous allez simplement lire des nœuds un par un. P>
xdocument.parse code> devrait faire le tour. P>
Je ne vois pas le point de l'envelopper dans un stringreader. Autant que je sache, le seul but de StringReader est d'avoir des chaînes mutables telles que lorsque beaucoup d'opérations de chaîne sont effectuées. La surcharge de la création de nouvelles chaînes pour chaque manipulation de chaîne est partie avec StringReader. Je ne vois pas comment ça correspond ici?
@HENRY: Vous êtes déroutant StringWriter code> avec stringreader code>. StringReader CODE> est utilisé ici pour fournir TEXTREADER CODE> Interface sur une chaîne simple, car xmlreader.create code> attend textreader code>.
@Newbite: Si vous n'avez pas de linq, choisissez (code> xmldocument code> ou xpathdocument code> en fonction de vos besoins. Si vous allez seulement lire des données, xpathdocument code> serait probablement mieux.
pour la navigation? Probablement de msdn, p> fournit une représentation rapide, en lecture seule, en mémoire d'un document XML à l'aide du modèle de données XPATH. P>
blockquote> contrairement à xpathdocument code> :
xmldocument code> etc., il est optimisé pour une utilisation en lecture-loi; plus efficace mais moins puissant (c'est-à-dire que vous ne pouvez pas le modifier). Pour les notes sur la façon de la questionner, voir ici . P> p>
Il convient de noter que xpathdocument code> est en fait significativement i> plus rapide sur certaines sortes de requêtes XPath; notamment quoi que ce soit impliquant précédant code> ou frère précédent code> axe.
Sachez que vous n'avez pas appelé Disposer () sur le StringReader que vous avez créé dans cet exemple. Consultez la réponse acceptée de Robert Rossney.
@AlexintLsos ne me trompe pas: Normalement, je suis exceptionnellement pédant sur Idisposable code>; Mais: stringreader code> n'est qu'un de ces cas où il vraiment, vraiment i> ne va pas dans la matière. Est-ce plus correct de le disposer? Bien sur. Est-ce que jamais i> importe, dans n'importe quel mode i>? Nope; p
Pouah; Comment savons-nous cela? J'aimerai bien sûr qu'il y ait un moyen de savoir quand les classes-cadres hériter inutilement d'Idisposable, ou que les outils d'analyse du compilateur ou de code indiqueraient aux personnes que leur classe ne détient ni des ressources natives ni des objets isisposables, de sorte qu'elles n'hérent pas inutiles de manière inutile. Mon cas préféré: Clients WCF . Mes destructeurs C ++ me manquent.
Pour la vitesse, utilisez un Le ci-dessus imprime le contenu du texte de chaque élément nommé "FOO" dans le document XML. (Eh bien, sorte de. Utilisation d'un si vous n'êtes pas concerné par la performance ou l'utilisation de la mémoire, il est plus simple d'utiliser un xmlreader code>: Readstring code> ne gère pas les éléments imbriqués très gracieusement.) P> XPathDocument code> est plus lent, car le document complet est analysé Avant de pouvoir commencer à la chercher, mais il a le mérite de la simplicité: p> Xmldocument code>: p>
Belle réponse avec des échantillons de code. Comme une note latérale, xpathnodeiterator code> implémente ienumerable code>, il n'y a donc pas besoin d'utiliser pendant code> - foreach code> fera le tour De plus, et est plus facile à lire.