2011-05-05 3 views
0

J'ai besoin de charger xml à partir d'un fichier dans un XmlDocument. Le problème est que le fichier contient des espaces blancs. (Je n'ai aucun contrôle sur le système qui produit le fichier.) Existe-t-il un moyen propre/facile d'ignorer ou de supprimer ces caractères?Comment ignorer les espaces blancs dans un fichier XML?

string SamplelRequestFile = @"C:\example.xml"; 
XmlDocument docXML = new XmlDocument(); 
XmlTextReader xReader = new XmlTextReader(SamplelRequestFile); 
XmlReaderSettings ReaderSettings = new XmlReaderSettings(); 
ReaderSettings.XmlResolver = null; 
ReaderSettings.ProhibitDtd = false; 
docXML.Load(xReader); 

exemple.xml (notez les espaces principaux)

<?xml version="1.0" ?> 
<myRoot> 
<someElement /> 
</myRoot> 

Répondre

4

Vous avez juste à faire quelque chose comme

using (StreamReader sr = new StreamReader(@"C:\example.xml")) 
{ 
     XmlDocument docXML = new XmlDocument(); 
     docXML.LoadXml(sr.ReadToEnd().Trim()); 
     ... 
} 
+0

Cela fonctionnera, mais seulement pour les documents plus petits. Si vous commencez à traiter de très gros documents, vous rencontrerez des problèmes. Une solution possible consiste à créer un nouveau type de flux lit le fichier XML et refuse simplement de renvoyer des caractères jusqu'à ce qu'il trouve le premier caractère non-espace dans le flux. –

+0

Une autre option consiste à essayer de traiter le document comme un fragment XML, le XmlTextReader peut être plus indulgent: http://msdn.microsoft.com/en-us/library/cakk7ha0.aspx –

+0

Cela ne fonctionnera que si le fichier XML est codé en UTF-8 car ReadToEnd lit en UTF-8 par défaut. – Daniel

0

Avez-vous essayé d'ajouter ce drapeau?

ReaderSettings.IgnoreWhitespace = true; 
+0

Oui, mais cela ne vaut que pour le XML une fois qu'il est lu. Dans ce cas, les espaces blancs empêchent la reconnaissance des données en tant que code XML lisible. –

3

Ceci est une XML non valide.

selon la spécification XML, pi ou traitement-instructions doivent être les premiers caractères s'ils sont présents.

Je vous suggère de pré-traiter le XML par en ajustant le XML.


Solution:

string content = File.ReadAllText(@"C:\example.xml"); 
XmlDocument doc = new XmlDocument(); 
doc.LoadXml(content.Trim()); 
+0

Oui, je sais que c'est un code XML invalide. Mais c'est précisément le problème qui doit être résolu. –

+0

Qui a donné downvote? Attendez de voir la solution de contournement ... – Aliostad

+0

Le problème est, ceci limite la taille de XML qui peut être traitée par la quantité de mémoire disponible. Si vous avez un de ces fichiers XML 2gb, vous venez de faire tomber le système. Vous n'avez peut-être pas le contrôle de vos flux mais ils n'envoient pas de XML, vous devez les faire réparer. –

1

Créer un Stream et un StreamReader sur le fichier vous-même, puis Peek() et consommer des caractères du flux aussi longtemps que vous voyez un espace. Une fois que vous êtes sûr que le prochain caractère est <, passez le flux au constructeur XmlTextReader.

0
string newXml = string.TrimLeft(oldXml); 
2

ici est un exemple qui fonctionne:

 string file = @"C:\example.xml"; 
     XmlDocument docXML = new XmlDocument(); 
     using (TextReader x = new StreamReader(file)) 
     { 
      while (x.Peek() == ' ') 
       x.Read(); 
      docXML.Load(x); 
     } 
+0

c'est la meilleure solution à mon humble avis –

Questions connexes