Comment construire XmlNodes de XmlReader
Je suis de l'analyse d'un grand nombre de fichiers volumineux et après profilage mon goulot d'étranglement est:
XmlDocument doc = new XmlDocument();
doc.Load(filename);
Cette approche a été très utile car j'ai pu extraire les nœuds comme ceci:
XmlNodeList nodeList = doc.SelectNodes("myXPath");
Je suis de commutation à XmlReader, mais Quand j'ai trouver l'élément que j'ai besoin d'extraire je suis bloqué en ce qui concerne la façon de construire un XmlNode de ne pas trop familier avec XmlReader:
XmlReader xmlReader = XmlReader.Create(fileName);
while (xmlReader.Read())
{
//keep reading until we see my element
if (xmlReader.Name.Equals("myElementName") && (xmlReader.NodeType == XmlNodeType.Element))
{
//How do I get the Xml element from the reader here?
}
}
Je voudrais être en mesure de construire une List<XmlNode>
objet. Je suis sur .NET 2.0.
Toute aide appréciée!
OriginalL'auteur JohnIdol | 2009-10-14
Vous devez vous connecter pour publier un commentaire.
La
XmlNode
type ne possède pas de constructeur public, de sorte que vous ne pouvez pas les créer sur votre propre. Vous aurez besoin d'avoir unXmlDocument
que vous pouvez utiliser pour créer:Oui, sauf si vous ajouter quelque chose aux éléments (par l'affectation de quelque chose à la
InnerText
propriété par exemple), ils seront vides.oh yep - semble évident maintenant, depuis que je suis juste de passage le nom de l'élément, merci
Il en résulte uniquement des nœuds vides. Vous pouvez utiliser
doc.ReadNode(reader)
à réellement obtenir la totalité du nœud commeXmlNode
OriginalL'auteur Fredrik Mörk
Pourquoi ne pas simplement faire ce qui suit?
Cette réponse est la bonne l'une que l'autre laisse vide nœuds!
OriginalL'auteur executor
XmlReader
etXmlDocument
une très grande façon de la traiter.XmlReader
garde rien en mémoire et en utilisant une seule approche, par opposition à l'élaboration d'un arbre DOM en mémoire pourXmlDocument
. Il est utile lorsque la performance est un problème, mais il faut aussi écrire votre application différemment: au lieu d'utiliserXmlNode
, vous n'avez pas garder quoi que ce soit et ne traiter que "sur le pouce": c'est à dire, lorsqu'un élément de passe que vous avez besoin, vous faire quelque chose. Il est proche de la SAX approche, mais sans le modèle de rappel.La réponse à "comment faire pour obtenir l'XmlElement" est: vous aurez à les construire à partir de zéro basée sur les informations du lecteur. Cela, malheureusement, défie le gain de performance. Il est souvent préférable de prévenir à l'aide de DOM approches complètement une fois que vous passez à XmlReader, sauf pour quelques cas distincts.
Aussi, le "très pratique" de manière à extraire les nœuds à l'aide de XPath (
SelectNodes
est ce que vous montrer ci-dessus) ne peut être utilisé ici: XPath nécessite une arborescence DOM. Considérer cette approche comme une approche de filtrage: vous pouvez ajouter des filtres à la XmlReader et dites-lui d'ignorer certains nœuds ou de lire jusqu'à un certain nœud. Ce qui est extrêmement rapide, mais une façon différente de penser.OriginalL'auteur Abel
Utilisation
XmlDocument.ReadNode
pour cette approche. MettreXmlReader
à l'aide de déclaration et d'utilisationXmlReader.LocalName
à la place du Nom de supprimer préfixe d'espace de noms.OriginalL'auteur Mehdi Golchin
J'ai utilisé la solution de contournement suivante quand je l'ai eu pour insérer des données à partir d'un
XmlReader
dans unXmlDocumenht
:OriginalL'auteur Barney Light
Voici ma démarche:
Les nœuds peuvent ensuite être importé dans un autre document pour la poursuite du traitement.
OriginalL'auteur Björn Lindqvist