使用 XmlReader 进行数据一致性检查
更新:November 2007
默认情况下,由 Create 方法创建的 XmlReader 对象比 XmlTextReader 实现一致性更强。默认情况下,通过 Create 方法创建的 XmlReader 对象支持下列功能:
标准化换行符。
扩展实体。
添加默认属性。
通过 XmlReaderSettings.CheckCharacters 和 XmlReaderSettings.ConformanceLevel 属性可以指定要在已创建的 XmlReader 对象上启用的一致性检查类型。
CheckCharacters 设置
XmlReaderSettings 类的 CheckCharacters 属性指示读取器检查字符,如果任何字符不在合法 XML 字符的范围内,将引发 XmlException。 如果启用字符检查,必须确保符合下列条件:
文档中的所有字符均在 W3C XML 1.0 Recommendation (W3C XML 1.0 建议)定义的合法 XML 字符范围内。
所有 XML 名称均有效。 例如,如果元素名以数字开头,将引发 XmlException。 有关更多信息,请参见 http://www.w3.org/TR/REC-xml\#NT-Name。
默认情况下启用字符检查。 如果读取器正在处理文本数据,将始终检查 XML 名称是否有效,即使 CheckCharacters 属性设置为 false。
ConformanceLevel 设置
XmlReaderSettings 类的 ConformanceLevel 属性将 XmlReader 配置为检查并确保正在读取的流符合特定的规则集。 根据指定的一致性级别,可以检查 XML 数据是否符合格式正确的 XML 1.0 文档或文档片断适用的规则。 如果数据不符合规则,将引发 XmlException。 默认设置为 ConformanceLevel.Document。
说明: |
---|
如果读取器配置为支持 ConformanceLevel.Fragment,但是 XML 数据包含文档类型定义 (DTD),将引发 XmlException。 如果存在 DTD,XML 1.0 建议要求文档级别的一致性。 |
ConformanceLevel 值 |
说明 |
||
---|---|---|---|
Document |
XML 数据符合格式正确的 XML 1.0 文档适用的规则。 此检查级别确保任何处理器均可以使用作为 XML 1.0 document (XML 1.0 文档)读取的流。 读取器检查下列事项:
|
||
Fragment |
XML 数据符合格式正确的 XML 1.0 文档片断适用的规则。 此设置接受包含多个根元素的 XML 数据或位于顶级的文本节点。 此检查级别确保任何处理器均可以使用作为 XML 1.0 external parsed entity(XML 1.0 外部分析的实体)读取的流。
|
||
Auto |
读取器基于传入的数据决定要应用的一致性检查级别。 如果 XML 数据包含 DTD 信息,将应用文档一致性检查。 如果 XML 数据包含下列某一项,将应用片断一致性检查。
如果存在冲突,例如在根级别存在文本节点和 DTD 时,将引发 XmlException。 如果使用 Create 方法为现有 XmlReader 添加附加功能,可以在包装方案中使用此设置。 在这种情况下,ConformanceLevel.Auto 不添加任何新的一致性检查。 一致性检查留给正在包装的 XmlReader。 |
XmlTextReader、XmlValidatingReader 和 XmlNodeReader 对象
在使用 XmlTextReader、XmlValidatingReader 或 XmlNodeReader 对象时,ConformanceLevel 设置具有下列行为。
如果不是使用 Create 方法创建的 XmlReader 对象,假定的一致性级别为 Document。 因此,如果决定将此 XmlReader 实例包装在另一个 XmlReader 对象中,在创建新的 XmlReader 对象时,指定的一致性级别必须为 Document 或 Auto。
如果基础 XmlTextReader 或 XmlValidatingReader 对象使用 XmlParserContext 对象和 XmlNodeType.Element 构造,还可以应用 Fragment 设置。
示例
以下代码创建一个强制执行片断级一致性检查的读取器。
Dim settings as XmlReaderSettings = new XmlReaderSettings()
settings.ConformanceLevel = ConformanceLevel.Fragment
Dim reader as XmlReader = XmlReader.Create(new StringReader(xmlString), settings)
XmlReaderSettings settings = new XmlReaderSettings();
settings.ConformanceLevel = ConformanceLevel.Fragment;
XmlReader reader = XmlReader.Create(new StringReader(xmlString), settings);