2011-01-28 1 views
3

J'essaie de créer une application simple qui lit un XML en utilisant SAX (XmlTextReader) à partir d'un flux qui contient non seulement le XML mais aussi d'autres données telles que des blobs binaires et du texte. La structure du flux est simplement basée sur un bloc.XmlTextReader passe la fin du document XML sans reconnaître

Lorsque j'entre dans ma fonction de lecture, le flux est correctement positionné au début du XML. J'ai réduit la question à l'exemple de code suivant:

string xml = "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?><Models />" + (char)0x014; 

XmlTextReader reader = new XmlTextReader(new StringReader(xml)); 
reader.MoveToContent(); 
reader.ReadStartElement("Models"); 

Ces quelques lignes provoque une exception lors de l'appel ReadStartElement en raison du 0x014 à la fin de la chaîne.

La chose intéressante à ce sujet est que le code fonctionne très bien lorsque vous utilisez la place entrée suivante:

string xml = "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?><Models></Models>" + (char)0x014; 

Je ne veux pas lire le document en entier en raison de sa taille et je ne veux changer l'entrée car j'ai besoin de rester rétrocompatible avec les anciennes entrées de données. La seule solution à laquelle je pense d'abord est un lecteur de flux personnalisé qui ne continue pas à lire après la dernière balise de fin, mais qui impliquerait des efforts d'analyse importants.

Avez-vous des idées pour résoudre ce problème? J'ai déjà essayé d'utiliser XDocument de LINQ mais cela a également échoué.

Merci beaucoup à l'avance, Cheers,

Romout

+1

BTW, vous ne devriez pas utiliser 'new XmlTextReader()'. Il a été déprécié depuis .NET 2.0. Utilisez 'XmlWriter.Create()' à la place. –

+0

Aussi, y a-t-il une pensée pour vous donner des données sensibles? Mélanger binaire et texte (XML) n'a pas beaucoup de sens, sauf si vous pouvez identifier les blocs XML basés sur un en-tête ou quelque chose. –

+0

Nous avons finalement avancé sur l'utilisation des informations d'en-tête supplémentaires pour extraire les données XML du flux avant de finalement l'analyser. Cette approche fonctionne bien et est effondrement compatible descendante – Romout

Répondre

0

Je ne sais pas si cela est tout à fait ce que vous cherchez, mais si vous appelez à la place:

reader.IsStartElement("Models");,

que le noeud <Models/> ne sera testé que s'il s'agit d'une balise de début ou d'une balise d'élément vide et si le nom correspond. Le lecteur ne sera pas déplacé au-delà (la méthode Read() ne sera pas appelée).

Questions connexes