2017-02-16 59 views
0

我有以下代碼:StreamReader的覆蓋INT讀([輸入,輸出]的char []緩衝區,詮釋指數,詮釋計數)

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行的'Description'開始標記與'Descrip'的結束標記不匹配。線53,位置156在System.Xml.XmlTextReaderImpl.Throw(例外五)在System.Xml.XmlTextReaderImpl.ThrowTagMismatch(NODEDATA STARTTAG)在System.Xml.XmlTextReaderImpl.ParseEndElement()在System.Xml.XmlTextReaderImpl.ParseElementContent()

這個例外的原因是Read只在開始時被調用一次,而在加載下一個數據塊時永遠不會調用Read。

任何人都可以解釋爲什麼會發生這種情況?

+0

...又是什麼異常說...? – mortb

+0

正如我提到的函數Read只被調用一次!所以我只得到了一部分文件。例外情況是:第53行第6位的'描述'開始標記與'Descrip'的結束標記不匹配。線53,位置156 在System.Xml.XmlTextReaderImpl.Throw(例外五) 在System.Xml.XmlTextReaderImpl.ThrowTagMismatch(NODEDATA STARTTAG) 在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; 
}