修改SqlCommand.ExecuteXmlReader生成的XmlReader的CheckCharacters属性无效,该如何解决?
问题分析与解决方法
你遇到的问题是:通过XmlReader.Create包装已有XmlReader并设置CheckCharacters = false后,reader.Settings.CheckCharacters仍为true。原因在于当用XmlReader.Create包装已存在的XmlReader实例时,传入的XmlReaderSettings中的CheckCharacters设置无法覆盖底层读取器的字符检查行为——底层读取器(即ExecuteXmlReader返回的实例)已经在执行字符检查,包装后的读取器仅作为代理传递操作,不会重新修改字符检查的配置。
正确实现方式
要真正禁用字符检查,需直接从数据源(而非已有的XmlReader)创建新的XmlReader,具体步骤如下:
- 将SQL命令执行的XML结果读取为内存流;
- 基于该流,使用配置好
CheckCharacters = false的XmlReaderSettings创建新读取器。
示例代码:
using (var ms = new MemoryStream()) { // 将ExecuteXmlReader的结果写入内存流 using (var readerOrg = command.ExecuteXmlReader()) { var xmlContent = readerOrg.ReadOuterXml(); var writer = new StreamWriter(ms); writer.Write(xmlContent); writer.Flush(); ms.Position = 0; // 重置流位置到起始处 } // 使用XmlReaderSettings创建新的读取器 var settings = new XmlReaderSettings { CheckCharacters = false, ConformanceLevel = ConformanceLevel.Auto }; using (var reader = XmlReader.Create(ms, settings)) { reader.Read(); // 验证设置是否生效 Console.WriteLine(reader.Settings.CheckCharacters); // 输出 false } }
补充说明
官方文档中提到的“为现有XML读取器添加功能”,指的是添加验证、命名空间支持这类额外扩展功能,而非修改底层读取器已绑定数据读取流程的核心行为(比如字符检查)。对于字符检查这类设置,必须在读取数据的源头(流或文本)创建读取器时配置,才能真正生效。
内容的提问来源于stack exchange,提问作者Kvasi
相关产品推荐
相关产品推荐

