8
votes

Comment lire le gros fichier XML sans le charger en mémoire et utiliser xelement

Je veux lire un gros fichier XML (100 + m). En raison de sa taille, je ne veux pas le charger en mémoire en utilisant XElement. J'utilise des requêtes LINQ-XML pour analyser et le lire.

Quelle est la meilleure façon de le faire? Tout exemple sur la combinaison de xpath ou xmlreader avec linq-xml / xelement?

aide s'il vous plaît. Merci.


0 commentaires

3 Réponses :


9
votes

Oui, vous pouvez combiner XMLreader avec le Méthode xnode.Readfrom , voir l'exemple de la documentation qui utilise C # pour traiter sélectivement les nœuds trouvés par le XMLreader comme xélément.


3 commentaires

brillant. Je développe une application qui traitera plusieurs fichiers XML de 200 millions et XDocument me tue. Cela a fait une énorme amélioration. Merci.


Je pense qu'il y a un bug dans le code exemple de la page xnode.readfrom de la documentation. La déclaration xelement el = xelement.readfrom (lecteur) en tant que xelement; devrait être xelement el = nouveau xelement (lecteur.name, lecteur.value); . AS-EST, les premiers éléments de deux "enfants" sont ignorés dans le fichier XML à partir duquel il se lit.


Voir ma réponse pour le code qui fonctionne pour moi; Voir Cette réponse par Jon Skeet pour une explication des raisons pour lesquelles les deux méthodes de "lecture" ne devraient pas être mélangées. [La réponse de Jon ne mentionne pas la méthode xnode.readfrom explicitement, mais je suis convaincu que le même problème s'applique.]



1
votes

Gardez simplement à l'esprit que vous devrez lire le fichier séquentiellement et faire référence à des frères et sœurs ou que des descendants sera lent au mieux et impossible au pire. Sinon @martinhonnn a la clé.


0 commentaires

6
votes

L'exemple de code dans la documentation MSDN pour le xnode.readfrom est comme suit: xxx

mais j'ai trouvé que le streamrochilddoc < / Code> La méthode dans l'exemple doit être modifiée comme suit: xxx


1 commentaires

Oui. Le premier exemple ne fonctionne pas. Il va lire trop et sauter tous les autres "enfants"