2017-02-16 1 views
0

i ont code suivant:StreamReader override int Read ([In, Out] tampon char [], int index, nombre int)

public class TestStreamReader : StreamReader 
    { 
. 
. 
     public override int Read([In, Out] char[] buffer, int index, int count) 
     { 
      char[] charBuffer = new char[buffer.Length]; 
      int i = base.Read(charBuffer, index, count); 
      string s = new string(charBuffer); 
      s = s.CleanInvalidXmlChars(); 
      Buffer.BlockCopy(s.ToCharArray(), index, buffer, index, count); 

      return i; 
     } 
} 

Mais si je fais appel suivant:

XmlReaderSettings settings = new XmlReaderSettings 
       { 
        DtdProcessing = DtdProcessing.Ignore 
       }; 
using (DataSet ds = new DataSet()) { 
    using (TestStreamReader stream = new TestStreamReader(fileName)) { 
     using (XmlReader tr = XmlReader.Create(stream, settings)) { 
      ds.ReadXml(tr); 
      ImportDataSet(ds); 
     } 
    } 
} 

    public static string CleanInvalidXmlChars(this string input) 
    { 
     if (string.IsNullOrWhiteSpace(input)) { 
      return input; 
     }   
     return input.Replace(" ", " "); 
    } 

Je reçois une exception:

La balise de démarrage 'Description' de la ligne 53 position 6 ne correspond pas à l'étiquette de fin de 'Descrip'. Ligne 53, position 156. à System.Xml.XmlTextReaderImpl.Throw (Exception e) à System.Xml.TextReaderImpl.ThrowTagMismatch (NodeData startTag) à System.Xml.XmlTextReaderImpl.ParseEndElement() à System.Xml.XmlTextReaderImpl.ParseElementContent()

la raison de l'exception est que la lecture est appelée une seule fois au début et jamais plus pour le chargement suivant des morceaux de données.

Quelqu'un peut-il expliquer pourquoi cela se produit-il?

+0

... et que dit l'exception ...? – mortb

+0

comme je l'ai mentionné la fonction Read a été appelée qu'une seule fois! Donc, je ne reçois qu'une partie du fichier. L'exception est la suivante: La balise de début 'Description' sur la ligne 53 position 6 ne correspond pas à l'étiquette de fin de 'Descrip'. Ligne 53, la position 156. à System.Xml.XmlTextReaderImpl.Throw (Exception e) à System.Xml.XmlTextReaderImpl.ThrowTagMismatch (NodeData STARTTAG) à System.Xml.XmlTextReaderImpl.ParseEndElement() à System.Xml.XmlTextReaderImpl .ParseElementContent() –

+1

Cette exception indique clairement que votre code XML n'est pas valide. Je suppose que vous devez corriger votre méthode 'CleanInvalidXmlChars', que vous n'avez pas partagée avec nous. – Amy

Répondre

0

Buffer.BlockCopy travaille avec BYTES, donc si le tableau de la copie avec le caractères quantité d'octets doivent être multipliés par 2 ou sizeof (char)

Mes remerciements vont à Damien_The_Unbeliever pour indication droite:

Code final:

public override int Read([In, Out] char[] buffer, int index, int count) 
{ 
    char[] charBuffer = new char[buffer.Length]; 
    int i = base.Read(charBuffer, index, count); 
    string s = new string(charBuffer); 
    s = s.CleanInvalidXmlChars(); 
    char[] tempBuffer = s.ToCharArray(); 
    int sizeOfChar = sizeof(char); 
    Buffer.BlockCopy(tempBuffer, index*sizeOfChar, buffer, index*sizeOfChar, count*sizeOfChar); 

    return i; 
}