2017-02-16 24 views
0

я следующий код:StreamReader переопределение INT Read ([In, Out] символ [] буфер 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; 
     } 
} 

Но если я следующий вызов:

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(" ", " "); 
    } 

Я получаю исключение:

Начальный тег «Описание» в строке 53 позиции 6 не соответствует тегу конца «Descrip». Строка 53, позиция 156. в System.Xml.XmlTextReaderImpl.Throw (исключение e) в System.Xml.XmlTextReaderImpl.ThrowTagMismatch (NodeData startTag) в System.Xml.XmlTextReaderImpl.ParseEndElement() в System.Xml.XmlTextReaderImpl.ParseElementContent()

Причиной исключения является то, что Read вызывается только один раз в начале и не более для загрузки следующих фрагментов данных.

Может кто-нибудь объяснить, почему это происходит?

+0

... и что говорит исключение ...? – mortb

+0

Как я уже говорил, функция Read была вызвана только один раз! Поэтому я получаю только часть из файла. Исключением является: Начальный тег «Описание» в строке 53 позиции 6 не совпадает с конечным тегом «Descrip». Линия 53, позиция 156. в System.Xml.XmlTextReaderImpl.Throw (Exception е) в System.Xml.XmlTextReaderImpl.ThrowTagMismatch (NodeData начальныйТег) в System.Xml.XmlTextReaderImpl.ParseEndElement() в System.Xml.XmlTextReaderImpl .ParseElementContent() –

+1

Это исключение явно указывает, что ваш XML недопустим. Я предполагаю, что вам нужно исправить свой метод «CleanInvalidXmlChars», который вы не поделили с нами. – Amy

ответ

0

Buffer.BlockCopy работает с BYTES, так что если скопировать массив символов количество байтов нужно умножить на 2 или SizeOf (Char)

Моя благодарность идет к Damien_The_Unbeliever правого намеком:

Окончательный код:

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; 
}