À l'aide de la classe XmlReader pour parser du XML avec des éléments du même nom
Je suis ré-écriture du code qui utilise un XmlDocument pour parser du XML. Je veux utiliser un XmlReader au lieu de voir si je peux obtenir quelques améliorations de performances.
La structure du XML ressemble à ceci:
<items>
<item id="1" desc="one">
<itemBody date="2012-11-12" />
</item>
<item id="2" desc="two">
<itemBody date="2012-11-13" />
</item>
<item id="3" desc="three">
<itemBody date="2012-11-14" />
</item>
<item id="4" desc="four">
<itemBody date="2012-11-15" />
</item>
</items>
En gros, j'ai besoin de parcourir tous les <item>
éléments. Comme je l'ai dit, l'ancien code fonctionne comme ceci:
XmlDocument document = new XmlDocument();
//load XML into XmlDocument
document.LoadXml(xml);
//use xpath to split into individual item
string xPath = @"items/item";
XmlNodeList nodeList = document.SelectNodes(xPath);
//loop through each item
for (int nodeIndex = 0; nodeIndex < nodeList.Count; nodeIndex++)
{
//do something with the XmlNode
nodeList[nodeIndex];
}
Cela fonctionne bien, mais je pense que l'utilisation d'un XmlReader serait plus rapide. J'ai donc écrit ceci:
XmlReader xmlReader = XmlReader.Create(new StringReader(xml));
while (xmlReader.Read())
{
if (xmlReader.Name.Equals("item") && (xmlReader.NodeType == XmlNodeType.Element))
{
string id = xmlReader.GetAttribute("id");
string desc = xmlReader.GetAttribute("desc");
string elementXml = xmlReader.ReadOuterXml();
}
}
Toutefois, ce code ne lit que la première <item>
élément. Le ReadOuterXml() est la rupture de la boucle. Quelqu'un sait comment contourner ce problème? Ou est ce type d'analyse n'est pas possible avec un XmlReader? J'ai l'obligation de le faire à l'aide .NET version 2 🙁 Donc je ne peux pas utiliser LINQ.
ce n'est pas une réponse, mais... avez-vous utilisé xsd2code? Est très utile pour analyser le langage xml pour les classes
Quelle est la valeur de retour de cette? nouveau StringReader(xml).ReadToEnd()
OriginalL'auteur Matt Puleston | 2012-11-30
Vous devez vous connecter pour publier un commentaire.
La suite semble fonctionner :-
OriginalL'auteur Paul Diston
Viens de tester votre code en LinqPad. Fonctionne bien.
De sortie:
Peut-être il ya quelque chose de mal avec votre XML.
Salut Oleg, j'ai juste mis à jour à ma question. J'ai oublié de mentionner que j'ai besoin d'extraire l'élément xml.
OriginalL'auteur Oleg
Si vous pouvez utiliser Linq, voici une autre façon:
OriginalL'auteur Justin Bannister