【问题标题】:StreamReader override int Read([In, Out] char[] buffer, int index, int count)StreamReader override int Read([In, Out] char[] buffer, int index, int count)
【发布时间】:2017-02-16 14:02:44
【问题描述】:

我有以下代码:

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 上的“描述”开始标记与“描述”的结束标记不匹配。第 53 行,位置 156。在 System.Xml.XmlTextReaderImpl.ThrowTagMismatch(NodeData startTag) 在 System.Xml.XmlTextReaderImpl.ParseEndElement() 在 System.Xml.XmlTextReaderImpl.ParseElementContent() 的 System.Xml.XmlTextReaderImpl.Throw(Exception e)

异常的原因是 Read 在开始时仅被调用一次,并且不再用于加载下一个数据块。

谁能解释为什么会这样?

【问题讨论】:

  • ...异常说明了什么...?
  • 正如我提到的,函数 Read 只被调用了一次!所以我只得到文件的一部分。例外情况是:第 53 行位置 6 上的“描述”开始标记与“描述”的结束标记不匹配。第 53 行,位置 156。在 System.Xml.XmlTextReaderImpl.ThrowTagMismatch(NodeData startTag) 在 System.Xml.XmlTextReaderImpl.ParseEndElement() 在 System.Xml.XmlTextReaderImpl.ParseElementContent() 的 System.Xml.XmlTextReaderImpl.Throw(Exception e)
  • 该异常清楚地表明您的 XML 无效。我猜您需要修复您尚未与我们共享的 CleanInvalidXmlChars 方法。
  • 你想达到什么目的?尝试删除 StreamReader 中的无效 XML 字符似乎不是一个好主意...
  • 编辑您的问题并在此处添加代码。不要将代码放在 cmets 中。

标签: c# xml xml-parsing streamreader invalid-characters


【解决方案1】:

Buffer.BlockCopy 适用于 BYTES,因此如果使用 chars 复制数组,字节数需要乘以 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-29
    • 2020-11-03
    • 1970-01-01
    • 1970-01-01
    • 2015-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多