6
votes

Un moyen efficace de construire un document XML à partir d'une chaîne contenant du XML bien formé pour la navigation?

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?

Merci beaucoup pour votre aide.

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.


0 commentaires

4 Réponses :


3
votes

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.


0 commentaires

3
votes

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 stringreader , puis enveloppez-le dans xmlreader . 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.

Si la structure du document est suffisamment compliquée, vous pourriez avoir besoin (ou souhaitez) un dom - dans quel cas xdocument.parse devrait faire le tour.


3 commentaires

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 avec stringreader . StringReader est utilisé ici pour fournir TEXTREADER Interface sur une chaîne simple, car xmlreader.create attend textreader .


@Newbite: Si vous n'avez pas de linq, choisissez (code> xmldocument ou xpathdocument en fonction de vos besoins. Si vous allez seulement lire des données, xpathdocument serait probablement mieux.



11
votes

pour la navigation? Probablement xpathdocument : xxx

de msdn,

fournit une représentation rapide, en lecture seule, en mémoire d'un document XML à l'aide du modèle de données XPATH.

contrairement à xmldocument 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 .


4 commentaires

Il convient de noter que xpathdocument est en fait significativement plus rapide sur certaines sortes de requêtes XPath; notamment quoi que ce soit impliquant précédant ou frère précédent 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 ; Mais: stringreader n'est qu'un de ces cas où il vraiment, vraiment ne va pas dans la matière. Est-ce plus correct de le disposer? Bien sur. Est-ce que jamais importe, dans n'importe quel mode ? 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.



12
votes

Pour la vitesse, utilisez un xmlreader : xxx

Le ci-dessus imprime le contenu du texte de chaque élément nommé "FOO" dans le document XML. (Eh bien, sorte de. Readstring ne gère pas les éléments imbriqués très gracieusement.)

Utilisation d'un XPathDocument est plus lent, car le document complet est analysé Avant de pouvoir commencer à la chercher, mais il a le mérite de la simplicité: xxx

si vous n'êtes pas concerné par la performance ou l'utilisation de la mémoire, il est plus simple d'utiliser un Xmldocument : xxx


1 commentaires

Belle réponse avec des échantillons de code. Comme une note latérale, xpathnodeiterator implémente ienumerable , il n'y a donc pas besoin d'utiliser pendant - foreach fera le tour De plus, et est plus facile à lire.