Comment lire un XmlReader sans la faire avancer
hey les gars, j'ai ce scénario:
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.Element && reader.Name == itemElementName)
{
XElement item = null;
try
{
item = XElement.ReadFrom(reader) as XElement;
}
catch (XmlException ex)
{
//log line number and stuff from XmlException class
}
}
}
Au-dessus de la boucle, je suis la transformation d'un certain nœud (itemElementName) dans un XElement.
Certains nœuds sera bon XML et aller dans un XElement, cependant, certains ne seront pas d'.
Dans le CATCH, j'aimerais non seulement rattraper la norme XmlException trucs... j'aimerais aussi attraper un extrait de l'actuel Xml et d'une chaîne.
Cependant, si je fais tout type d'opération de LECTURE sur le nœud avant de passer à la XElement, il se déplace le lecteur de l'avant.
Comment pouvez obtenir un "instantané" du contenu de la OuterXml du lecteur sans interférer avec sa position?
OriginalL'auteur andy | 2010-06-01
Vous devez vous connecter pour publier un commentaire.
Fait ReadSubtree sera de retour un lecteur qui "encapsule" le lecteur d'origine. Donc, la lecture par le biais de la nouvelle finira par l'avancement de l'original.
Vous devez prendre en compte XmlReader en tant que seul lecteur, il ne peut tout simplement pas revenir en arrière.
Comme pour votre scénario, au lieu d'essayer de se rappeler une partie de l'XML, vous pouvez demander au lecteur de la position dans le fichier d'entrée. Juste le jeter aux IXmlLineInfo de l'interface, il a des méthodes de conduite de retour et la position. Avec ceci, on pourrait se souvenir de certains de la position de départ (avant de l'élément en question) et puis la fin de la position de l'erreur. Et puis lire qu'une partie de la intput fichier en tant que texte brut.
Ah.. je suis totalement mal interprété du point de ReadSubTree alors.. désolé. Pour être honnête, il n'est pas évident à partir de la documentation dans l'explorateur d'objets, mais la page MSDN rend plus claire.
Je viens juste de reprendre et d'avoir un autre regard sur le code que j'ai eu qui l'utilise; il en fait la lecture s'arrête complètement après c'est fini avec la sous-arborescence, donc je n'ai jamais remarqué qu'il avait avancé l'origine lecteur.
OriginalL'auteur Vitek Karas MSFT
Ne pas utiliser n'importe quel "Lire" opération sur le lecteur - comme vous l'avez découvert, ce progrès. Utiliser les appels à des propriétés telles que
reader.HasValue
etreader.Value
pour inspecter le contenu. Consulter 'XmlReader' dans le navigateur d'objet, il y a un certain nombre de propriétés que vous pouvez lire.Edit: je ne pense pas qu'il ya un moyen facile de simplement obtenir le XML, peut-être parce que le nœud actuel peut ne pas être valide XML sur son propre, comme un XmlWhiteSpace, XmlText nœud ou même un XmlAttribute.
Probablement pas impossible; je suis moi-même coups de pied pour ne pas se souvenir de cela avant, mais si vous appelez
reader.ReadSubtree()
, elle crée un tout nouveau XmlReader qui commence à oùreader
est, vous pouvez lire que tout ce que vous voulez sans affecter l'original de votrereader
. Pas sûr à 100% comment vous pouvez l'utiliser dans votre situation, mais il semble que c'est probablement la voie à suivre.OriginalL'auteur Flynn1179
Une autre idée: lire l'externe XML (qui avance le lecteur), puis créer un nouveau lecteur de ce document XML qui vous permet de "revenir en arrière" et traiter les éléments du nœud actuel.
OriginalL'auteur CRD
Ce que j'ai fait était juste lu l'élément dans un XmlDocument, et de lire à la place. Dans mon cas, j'ai dû convertir un flux de document HTML. J'ai eu à lire un intérieur de l'élément de donner un "style" pour le parent de l'élément HTML.
OriginalL'auteur Priyadarshini Gorur
En fait, bien que Vitek Karas MSFT est droit, Helena Kupkova publié un habile peu de XML Signet Lecteur sur https://msdn.microsoft.com/en-us/library/aa302292.aspx. Cela permet de revenir en arrière en utilisant la mise en cache.
OriginalL'auteur a_f