【发布时间】: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