本文由机器翻译。若要查看英语原文,请勾选“英语”复选框。 也可将鼠标指针移到文本上,在弹出窗口中显示英语原文。
翻译
英语

XmlReader 类

 

表示提供对 XML 数据进行快速、非缓存、只进访问的读取器。

若要浏览此类型的.NET Framework 源代码,请参阅 Reference Source

命名空间:   System.Xml
程序集:  System.Xml(位于 System.Xml.dll)


public abstract class XmlReader : IDisposable

名称说明
System_CAPS_protmethodXmlReader()

初始化 XmlReader 类的新实例。

名称说明
System_CAPS_pubpropertyAttributeCount

当在派生类中被重写时,获取当前节点上的属性数。

System_CAPS_pubpropertyBaseURI

当在派生类中被重写时,获取当前节点的基 URI。

System_CAPS_pubpropertyCanReadBinaryContent

获取一个值,该值指示 XmlReader 是否实现二进制内容读取方法。

System_CAPS_pubpropertyCanReadValueChunk

获取一个值,该值指示 XmlReader 是否实现 ReadValueChunk 方法。

System_CAPS_pubpropertyCanResolveEntity

获取一个值,该值指示此读取器是否可以分析和解析实体。

System_CAPS_pubpropertyDepth

当在派生类中被重写时,获取 XML 文档中当前节点的深度。

System_CAPS_pubpropertyEOF

当在派生类中被重写时,获取一个值,该值指示此读取器是否定位在流的结尾。

System_CAPS_pubpropertyHasAttributes

获取一个值,该值指示当前节点是否有任何属性。

System_CAPS_pubpropertyHasValue

当在派生类中重写,获取一个值,该值指示当前节点是否可以具有 Value

System_CAPS_pubpropertyIsDefault

当在派生类中被重写时,获取一个值,该值指示当前节点是否是从 DTD 或架构中定义的默认值生成的特性。

System_CAPS_pubpropertyIsEmptyElement

当在派生类中重写,获取一个值,该值指示当前节点是否为空元素 (例如, <MyElement/>)。

System_CAPS_pubpropertyItem[Int32]

当在派生类中被重写时,获取具有指定索引的属性的值。

System_CAPS_pubpropertyItem[String]

当在派生类中重写时获取具有指定属性的值 Name

System_CAPS_pubpropertyItem[String, String]

当在派生类中重写时获取具有指定属性的值 LocalNameNamespaceURI

System_CAPS_pubpropertyLocalName

当在派生类中被重写时,获取当前节点的本地名称。

System_CAPS_pubpropertyName

当在派生类中被重写时,获取当前节点的限定名。

System_CAPS_pubpropertyNamespaceURI

当在派生类中被重写时,获取读取器定位在其上的节点的命名空间 URI(采用 W3C 命名空间规范中定义的形式)。

System_CAPS_pubpropertyNameTable

当在派生类中重写时获取 XmlNameTable 与此实现关联。

System_CAPS_pubpropertyNodeType

当在派生类中被重写时,获取当前节点的类型。

System_CAPS_pubpropertyPrefix

当在派生类中被重写时,获取与当前节点关联的命名空间前缀。

System_CAPS_pubpropertyQuoteChar

当在派生类中被重写时,获取用于括住特性节点值的引号字符。

System_CAPS_pubpropertyReadState

当在派生类中被重写时,获取读取器的状态。

System_CAPS_pubpropertySchemaInfo

获取作为架构验证结果分配给当前节点的架构信息。

System_CAPS_pubpropertySettings

获取用于创建此 XmlReader 实例的 XmlReaderSettings 对象。

System_CAPS_pubpropertyValue

当在派生类中被重写时,获取当前节点的文本值。

System_CAPS_pubpropertyValueType

获取当前节点的公共语言运行时 (CLR) 类型。

System_CAPS_pubpropertyXmlLang

当在派生类中重写,获取当前 xml:lang 作用域。

System_CAPS_pubpropertyXmlSpace

当在派生类中重写,获取当前 xml:space 作用域。

名称说明
System_CAPS_pubmethodClose()

当在派生类中重写,将更改 ReadStateClosed

System_CAPS_pubmethodSystem_CAPS_staticCreate(Stream)

使用带默认设置的指定流创建新的 XmlReader 实例。

System_CAPS_pubmethodSystem_CAPS_staticCreate(Stream, XmlReaderSettings)

使用指定的流和设置创建一个新的 XmlReader 实例。

System_CAPS_pubmethodSystem_CAPS_staticCreate(Stream, XmlReaderSettings, String)

使用指定的流、基 URI 和设置创建一个新的 XmlReader 实例。

System_CAPS_pubmethodSystem_CAPS_staticCreate(Stream, XmlReaderSettings, XmlParserContext)

使用指定的流、设置和用于分析的上下文信息创建一个新的 XmlReader 实例。

System_CAPS_pubmethodSystem_CAPS_staticCreate(String)

用指定的 URI 创建一个新的 XmlReader 实例。

System_CAPS_pubmethodSystem_CAPS_staticCreate(String, XmlReaderSettings)

使用指定的 URI 和设置创建新的 XmlReader 实例。

System_CAPS_pubmethodSystem_CAPS_staticCreate(String, XmlReaderSettings, XmlParserContext)

使用指定的 URI、设置和进行分析的上下文信息创建一个新的 XmlReader 实例。

System_CAPS_pubmethodSystem_CAPS_staticCreate(TextReader)

使用指定的文本读取器创建一个新的 XmlReader 实例。

System_CAPS_pubmethodSystem_CAPS_staticCreate(TextReader, XmlReaderSettings)

使用指定的文本读取器和设置创建一个新的 XmlReader 实例。

System_CAPS_pubmethodSystem_CAPS_staticCreate(TextReader, XmlReaderSettings, String)

使用指定的文本读取器、设置和基 URI 创建一个新的 XmlReader

System_CAPS_pubmethodSystem_CAPS_staticCreate(TextReader, XmlReaderSettings, XmlParserContext)

使用指定的文本读取器、设置和要用于分析的上下文信息创建一个新的 XmlReader 实例。

System_CAPS_pubmethodSystem_CAPS_staticCreate(XmlReader, XmlReaderSettings)

使用指定的 XML 读取器和设置创建一个新的 XmlReader 实例。

System_CAPS_pubmethodDispose()

释放 XmlReader 类的当前实例所使用的所有资源。

System_CAPS_protmethodDispose(Boolean)

释放由 XmlReader 占用的非托管资源,还可以另外再释放托管资源。

System_CAPS_pubmethodEquals(Object)

确定指定的对象是否等于当前对象。(继承自 Object。)

System_CAPS_protmethodFinalize()

在垃圾回收将某一对象回收前允许该对象尝试释放资源并执行其他清理操作。(继承自 Object。)

System_CAPS_pubmethodGetAttribute(Int32)

当在派生类中被重写时,获取具有指定索引的属性的值。

System_CAPS_pubmethodGetAttribute(String)

当在派生类中重写时获取具有指定属性的值 Name

System_CAPS_pubmethodGetAttribute(String, String)

当在派生类中重写时获取具有指定属性的值 LocalNameNamespaceURI

System_CAPS_pubmethodGetHashCode()

作为默认哈希函数。(继承自 Object。)

System_CAPS_pubmethodGetType()

获取当前实例的 Type(继承自 Object。)

System_CAPS_pubmethodGetValueAsync()

异步获取当前节点的值。

System_CAPS_pubmethodSystem_CAPS_staticIsName(String)

返回一个值,该值指示字符串自变量是否是有效的 XML 名称。

System_CAPS_pubmethodSystem_CAPS_staticIsNameToken(String)

返回一个值,该值指示该字符串自变量是否是有效的 XML 名称标记。

System_CAPS_pubmethodIsStartElement()

调用 MoveToContent 并测试当前内容节点是开始标记还是空元素标记。

System_CAPS_pubmethodIsStartElement(String)

调用 MoveToContent 并测试当前内容节点是开始标记还是空元素标记,以及如果 Name 属性找到的元素与给定的参数匹配。

System_CAPS_pubmethodIsStartElement(String, String)

调用 MoveToContent 并测试当前内容节点是开始标记还是空元素标记,以及如果 LocalNameNamespaceURI 属性找到的元素与给定的字符串匹配。

System_CAPS_pubmethodLookupNamespace(String)

当在派生类中被重写时,在当前元素的范围内解析命名空间前缀。

System_CAPS_protmethodMemberwiseClone()

创建当前 Object 的浅表副本。(继承自 Object。)

System_CAPS_pubmethodMoveToAttribute(Int32)

当在派生类中被重写时,移动到具有指定索引的属性。

System_CAPS_pubmethodMoveToAttribute(String)

当在派生类中重写,将移动到具有指定的属性 Name

System_CAPS_pubmethodMoveToAttribute(String, String)

当在派生类中重写,将移动到具有指定的属性 LocalNameNamespaceURI

System_CAPS_pubmethodMoveToContent()

检查当前节点是否为内容 (非空白文本、 CDATA, ,Element, ,EndElement, ,EntityReference, ,或 EndEntity) 节点。 如果此节点不是内容节点,则读取器向前跳至下一个内容节点或文件结尾。 它跳过以下类型的节点:ProcessingInstructionDocumentTypeCommentWhitespaceSignificantWhitespace

System_CAPS_pubmethodMoveToContentAsync()

异步检查当前节点是否为内容节点。 如果此节点不是内容节点,则读取器向前跳至下一个内容节点或文件结尾。

System_CAPS_pubmethodMoveToElement()

当在派生类中被重写时,移动到包含当前属性节点的元素。

System_CAPS_pubmethodMoveToFirstAttribute()

当在派生类中被重写时,移动到第一个属性。

System_CAPS_pubmethodMoveToNextAttribute()

当在派生类中被重写时,移动到下一个属性。

System_CAPS_pubmethodRead()

当在派生类中被重写时,从流中读取下一个节点。

System_CAPS_pubmethodReadAsync()

异步读取该流的下一个节点。

System_CAPS_pubmethodReadAttributeValue()

当在派生类中重写,将属性值分析为一个或多个 Text, ,EntityReference, ,或 EndEntity 节点。

System_CAPS_pubmethodReadContentAs(Type, IXmlNamespaceResolver)

将内容作为指定类型的对象读取。

System_CAPS_pubmethodReadContentAsAsync(Type, IXmlNamespaceResolver)

将内容作为指定类型的对象异步读取。

System_CAPS_pubmethodReadContentAsBase64(Byte[], Int32, Int32)

读取内容并返回 Base64 解码的二进制字节。

System_CAPS_pubmethodReadContentAsBase64Async(Byte[], Int32, Int32)

异步读取内容并返回 Base64 解码的二进制字节。

System_CAPS_pubmethodReadContentAsBinHex(Byte[], Int32, Int32)

读取内容并返回 BinHex 解码的二进制字节。

System_CAPS_pubmethodReadContentAsBinHexAsync(Byte[], Int32, Int32)

异步读取内容并返回 BinHex 解码的二进制字节。

System_CAPS_pubmethodReadContentAsBoolean()

作为将当前位置的文本内容读取 Boolean

System_CAPS_pubmethodReadContentAsDateTime()

作为将当前位置的文本内容读取 DateTime 对象。

System_CAPS_pubmethodReadContentAsDateTimeOffset()

作为将当前位置的文本内容读取 DateTimeOffset 对象。

System_CAPS_pubmethodReadContentAsDecimal()

作为将当前位置的文本内容读取 Decimal 对象。

System_CAPS_pubmethodReadContentAsDouble()

将当前位置的文本内容作为双精度浮点数读取。

System_CAPS_pubmethodReadContentAsFloat()

将当前位置的文本内容作为单精度浮点数读取。

System_CAPS_pubmethodReadContentAsInt()

将当前位置的文本内容作为 32 位有符号整数读取。

System_CAPS_pubmethodReadContentAsLong()

将当前位置的文本内容作为 64 位有符号整数读取。

System_CAPS_pubmethodReadContentAsObject()

作为将当前位置的文本内容读取 Object

System_CAPS_pubmethodReadContentAsObjectAsync()

异步读取作为当前位置的文本内容 Object

System_CAPS_pubmethodReadContentAsString()

作为将当前位置的文本内容读取 String 对象。

System_CAPS_pubmethodReadContentAsStringAsync()

异步读取作为当前位置的文本内容 String 对象。

System_CAPS_pubmethodReadElementContentAs(Type, IXmlNamespaceResolver)

将元素内容作为请求类型读取。

System_CAPS_pubmethodReadElementContentAs(Type, IXmlNamespaceResolver, String, String)

检查指定的本地名称和命名空间 URI 与当前元素的本地名称和命名空间 URI 是否匹配,然后将元素内容作为请求类型读取。

System_CAPS_pubmethodReadElementContentAsAsync(Type, IXmlNamespaceResolver)

将元素内容作为请求类型异步读取。

System_CAPS_pubmethodReadElementContentAsBase64(Byte[], Int32, Int32)

读取元素并对 Base64 内容进行解码。

System_CAPS_pubmethodReadElementContentAsBase64Async(Byte[], Int32, Int32)

异步读取元素并对 Base64 内容进行解码。

System_CAPS_pubmethodReadElementContentAsBinHex(Byte[], Int32, Int32)

读取元素并对 BinHex 内容进行解码。

System_CAPS_pubmethodReadElementContentAsBinHexAsync(Byte[], Int32, Int32)

以异步方式读取元素并将解码 BinHex 内容。

System_CAPS_pubmethodReadElementContentAsBoolean()

读取当前元素并返回将内容作为 Boolean 对象。

System_CAPS_pubmethodReadElementContentAsBoolean(String, String)

检查指定的本地名称和命名空间 URI 与当前元素的匹配,然后读取当前元素,并返回将内容作为 Boolean 对象。

System_CAPS_pubmethodReadElementContentAsDateTime()

读取当前元素并返回将内容作为 DateTime 对象。

System_CAPS_pubmethodReadElementContentAsDateTime(String, String)

检查指定的本地名称和命名空间 URI 与当前元素的匹配,然后读取当前元素,并返回将内容作为 DateTime 对象。

System_CAPS_pubmethodReadElementContentAsDecimal()

读取当前元素并返回将内容作为 Decimal 对象。

System_CAPS_pubmethodReadElementContentAsDecimal(String, String)

检查指定的本地名称和命名空间 URI 与当前元素的匹配,然后读取当前元素,并返回将内容作为 Decimal 对象。

System_CAPS_pubmethodReadElementContentAsDouble()

读取当前元素并将内容作为双精度浮点数返回。

System_CAPS_pubmethodReadElementContentAsDouble(String, String)

检查指定的本地名称和命名空间 URI 与当前元素的本地名称和命名空间 URI 是否匹配,然后读取当前元素,并将内容作为双精度浮点数返回。

System_CAPS_pubmethodReadElementContentAsFloat()

读取当前元素并将内容作为单精度浮点数返回。

System_CAPS_pubmethodReadElementContentAsFloat(String, String)

检查指定的本地名称和命名空间 URI 与当前元素的本地名称和命名空间 URI 是否匹配,然后读取当前元素,并将内容作为单精度浮点数返回。

System_CAPS_pubmethodReadElementContentAsInt()

读取当前元素并将内容作为 32 位有符号整数返回。

System_CAPS_pubmethodReadElementContentAsInt(String, String)

检查指定的本地名称和命名空间 URI 与当前元素的本地名称和命名空间 URI 是否匹配,然后读取当前元素,并将内容作为 32 位有符号整数返回。

System_CAPS_pubmethodReadElementContentAsLong()

读取当前元素并将内容作为 64 位有符号整数返回。

System_CAPS_pubmethodReadElementContentAsLong(String, String)

检查指定的本地名称和命名空间 URI 与当前元素的本地名称和命名空间 URI 是否匹配,然后读取当前元素,并将内容作为 64 位有符号整数返回。

System_CAPS_pubmethodReadElementContentAsObject()

读取当前元素并返回将内容作为 Object

System_CAPS_pubmethodReadElementContentAsObject(String, String)

检查指定的本地名称和命名空间 URI 与当前元素的匹配,然后读取当前元素,并返回将内容作为 Object

System_CAPS_pubmethodReadElementContentAsObjectAsync()

异步读取当前元素并返回将内容作为 Object

System_CAPS_pubmethodReadElementContentAsString()

读取当前元素并返回将内容作为 String 对象。

System_CAPS_pubmethodReadElementContentAsString(String, String)

检查指定的本地名称和命名空间 URI 与当前元素的匹配,然后读取当前元素,并返回将内容作为 String 对象。

System_CAPS_pubmethodReadElementContentAsStringAsync()

异步读取当前元素并返回将内容作为 String 对象。

System_CAPS_pubmethodReadElementString()

读取纯文本元素。 但是,我们建议你使用 ReadElementContentAsString() 方法相反,因为它提供了更直接的方法来处理此操作。

System_CAPS_pubmethodReadElementString(String)

检查 Name 属性找到的元素与给定的字符串匹配在读取纯文本元素之前。 但是,我们建议你使用 ReadElementContentAsString() 方法相反,因为它提供了更直接的方法来处理此操作。

System_CAPS_pubmethodReadElementString(String, String)

检查 LocalNameNamespaceURI 找到与给定的字符串匹配在读取纯文本元素之前的元素的属性。 但是,我们建议你使用 ReadElementContentAsString(String, String) 方法相反,因为它提供了更直接的方法来处理此操作。

System_CAPS_pubmethodReadEndElement()

检查当前内容节点是否为结束标记并将读取器推进到下一个节点。

System_CAPS_pubmethodReadInnerXml()

当在派生类中被重写时,将所有内容(包括标记)当做字符串读取。

System_CAPS_pubmethodReadInnerXmlAsync()

异步读取所有内容,包括作为字符串的标记。

System_CAPS_pubmethodReadOuterXml()

当在派生类中被重写时,读取表示该节点和所有它的子级的内容(包括标记)。

System_CAPS_pubmethodReadOuterXmlAsync()

异步读取包含该节点和所有它的子级的内容(包括标记)。

System_CAPS_pubmethodReadStartElement()

检查当前节点是否为元素并将读取器推进到下一个节点。

System_CAPS_pubmethodReadStartElement(String)

检查当前内容节点是元素与给定 Name 并将读取器推进到下一个节点。

System_CAPS_pubmethodReadStartElement(String, String)

检查当前内容节点是元素与给定 LocalNameNamespaceURI 并将读取器推进到下一个节点。

System_CAPS_pubmethodReadString()

当在派生类中被重写时,将元素或文本节点的内容当做字符串读取。 但是,我们建议你使用 ReadElementContentAsString 方法相反,因为它提供了更直接的方法来处理此操作。

System_CAPS_pubmethodReadSubtree()

返回一个新 XmlReader 能用于读取当前节点及其所有子代的实例。

System_CAPS_pubmethodReadToDescendant(String)

前移 XmlReader 到下一个具有指定限定名的子代元素。

System_CAPS_pubmethodReadToDescendant(String, String)

前移 XmlReader 到下一个具有指定的本地名称和命名空间 URI 的子代元素。

System_CAPS_pubmethodReadToFollowing(String)

一直读取,直到找到具有指定限定名的元素。

System_CAPS_pubmethodReadToFollowing(String, String)

一直读取,直到找到具有指定的本地名称和命名空间 URI 的元素。

System_CAPS_pubmethodReadToNextSibling(String)

前移 XmlReader 到下一个具有指定限定名的同级元素。

System_CAPS_pubmethodReadToNextSibling(String, String)

XmlReader 推进到具有指定的本地名称和命名空间 URI 的下一个同级元素。

System_CAPS_pubmethodReadValueChunk(Char[], Int32, Int32)

读取嵌入在 XML 文档中的大量文本流。

System_CAPS_pubmethodReadValueChunkAsync(Char[], Int32, Int32)

异步读取嵌入在 XML 文档中的大量文本流。

System_CAPS_pubmethodResolveEntity()

当在派生类中重写时解析的实体引用 EntityReference 节点。

System_CAPS_pubmethodSkip()

跳过当前节点的子级。

System_CAPS_pubmethodSkipAsync()

异步跳过当前节点的子级。

System_CAPS_pubmethodToString()

返回表示当前对象的字符串。(继承自 Object。)

System_CAPS_note说明

若要查看此类型的.NET Framework 源代码,请参阅 Reference Source 您可以浏览源代码、 下载脱机查看参考资料和调试; 在逐句通过源 (包括修补程序和更新)see instructions.

XmlReader 提供对 adocument 或流中的 XML 数据的只进、 只读访问。 此类符合 W3C Extensible Markup Language (XML) 1.0 (fourth edition)Namespaces in XML 1.0 (third edition) 建议。

XmlReader方法使你可以浏览 XML 数据并读取节点的内容。 类的属性反映是读取器定位在当前节点的值。 ReadState 属性值指示的 XML 读取器的当前状态。 例如,该属性设置为 Initial 通过 XmlReader.Read 方法和 Closed 通过 XmlReader.Close 方法。 XmlReader 此外提供了数据一致性检查,并且根据 DTD 或架构验证。

XmlReader使用拉模型检索数据。 此模型︰

  • 通过自然的、 由上而下的过程优化简化了状态管理。

  • 支持多个输入的流和分层。

  • 允许客户端为分析器提供字符串直接写入,并这样,就不必通过的额外字符串复制到其中的缓冲区。

  • 支持有选择地处理。 客户端可以跳过的项目并处理那些感兴趣的应用程序。 此外可以设置属性,事先以管理方式 (例如规范化) 处理 XML 流。

本节内容:

创建 XML 读取器
验证 XML 数据
数据一致性
在节点中导航
读取 XML 元素
读取 XML 特性
读取 XML 内容
转换为 CLR 类型
异步编程
安全注意事项

使用 Create 方法来创建 XmlReader实例。

尽管.NET Framework 提供的具体实现 XmlReader 类,如 XmlTextReader, ,XmlNodeReader, ,与 XmlValidatingReader 类中,我们建议仅在这些方案中使用的专用的类︰

  • 如果要用于 readan XML DOM 子树从 XmlNode 对象,请使用 XmlNodeReader 类。 (但是,此类不支持 DTD 或架构验证。)

  • 如果您必须根据请求展开实体,您不想将文本内容规范化,或者您不希望默认返回的属性,请使用 XmlTextReader 类。

若要指定您想要启用对 XML 读取器的功能集,请将传递 System.Xml.XmlReaderSettings 对象传递给 Create 方法。 可以使用一台 System.Xml.XmlReaderSettings 要创建具有相同的功能,多个读取器的对象或修改 System.Xml.XmlReaderSettings对象来创建新的读取器具有不同的功能集。 与现有读取器,可以方便地添加功能。

如果不使用System.Xml.XmlReaderSettings对象,则使用默认设置。 请参阅 Create 引用的详细信息页面。

XmlReader 引发 XmlException 的 XML 分析错误。 将引发异常后,将读取器状态是不可预测。 例如,报告的节点类型可能不同于当前节点的实际节点类型。 使用 ReadState 属性来检查读取器是否处于错误状态。

若要定义结构的 XML 文档及其元素关系、 数据类型和内容约束,使用文档类型定义 (DTD) 或 XML 架构定义语言 (XSD) 架构。 XML 文档被认为格式正确,如果它满足定义的所有语法要求 W3C XML 1.0 Recommendation 如果它的格式正确并且符合其 DTD 或架构定义的约束,它被视为有效。 (请参阅 W3C XML Schema Part 1: StructuresW3C XML Schema Part 2: Datatypes建议。) 因此,虽然所有有效的 XML 文档都是格式正确的,但并不是所有格式正确的 XML 文档都是有效的。

您可以验证数据针对 DTD,内联 XSD 架构或 XSD 架构存储在 XmlSchemaSet 对象 (缓存); 上描述了这些方案 Create 引用页面。 XmlReader 不支持 XML 数据缩减 (XDR) 架构验证。

在使用以下设置 XmlReaderSettings 类,以便指定哪种类型的验证,如果有的话,XmlReader 实例支持。

使用此 XmlReaderSettings 成员

若要指定

DtdProcessing 属性

是否允许 DTD 处理。 默认设置为不允许 DTD 处理。

ValidationType 属性

读取器是否应验证数据,以及要执行 (DTD 或架构) 的验证类型。 默认设置为无数据验证。

ValidationEventHandler事件

事件处理程序接收验证事件的有关信息。 如果未提供事件处理程序,在出现第一个验证错误时将引发 XmlException

ValidationFlags 属性

通过选项其他验证 XmlSchemaValidationFlags 枚举成员︰

  • AllowXmlAttributes-允许 XML 特性 (xml:*) 在实例文档,即使它们不架构中定义中。 属性基于其数据类型进行验证。请参阅 XmlSchemaValidationFlags 设置以在特定方案中使用的参考页。 (默认情况下禁用)。

  • ProcessIdentityConstraints -处理的标识约束 (xs:ID, ,xs:IDREF, ,xs:key, ,xs:keyref, ,xs:unique) 在验证期间遇到。 (默认情况下启用)。

  • ProcessSchemaLocation -处理架构由指定 xsi:schemaLocationxsi:noNamespaceSchemaLocation 属性。 (默认情况下启用)。

  • ProcessInlineSchema-在验证过程中处理内联 XML 架构。 (默认情况下禁用)。

  • ReportValidationWarnings-如果出现验证警告时,则报告事件。 如果没有验证特定元素或属性时所依据的 DTD 或 XML 架构,通常会发出警告。 ValidationEventHandler 用于通知。 (默认情况下禁用)。

Schemas

用于验证的 XmlSchemaSet

XmlResolver 属性

XmlResolver用于解析和访问外部资源。 这可以包括外部实体,例如 DTD 和架构,以及任何 xs:includexs:import XML 架构中所包含的元素。 如果没有指定 XmlResolver, 、 XmlReader 使用默认 XmlUrlResolver 使用没有用户凭据。

由创建的 XML 读取器 Create methodmeet 以下的法规遵从性要求,默认情况下︰

  • 新行和属性值进行规范化按照 W3C XML 1.0 Recommendation

  • 自动展开所有实体。

  • 始终添加文档类型定义中声明的默认属性,即使不会验证读取器也是如此。

  • 允许的 XML 前缀映射到正确的 XML 命名空间 URI 声明。

  • 在单个的表示法名称 NotationType 特性声明和NmTokens 在单个 Enumeration 属性 declarationare 不同。

使用这些 XmlReaderSettings 属性以指定类型的一致性检查您想要启用︰

使用此 XmlReaderSettings 属性

目标

默认

CheckCharacters 属性

启用或禁用以下检查︰

当此属性设置为 true (默认值), XmlException 如果 XML 文件包含非法字符或无效的 XML 名称将引发异常 (例如,元素名以数字开头)。

字符和名称检查已启用。

设置 CheckCharactersfalse 关闭字符检查的字符实体引用。 如果读取器正在处理文本数据时,始终检查 XML 名称是否有效,而不考虑此设置。

System_CAPS_note说明

如果存在 DTD,XML 1.0 建议要求文档级别的一致性。 因此,如果读取器配置为支持 ConformanceLevel.Fragment, ,但是 XML 数据包含文档类型定义 (DTD) XmlException 引发。

ConformanceLevel 属性

选择强制执行的一致性的级别︰

如果数据不符合规则, XmlException 则会引发异常。

Document

当前节点是在其的 XML 读取器当前所处的 XML 节点。 所有 XmlReader方法执行与此节点和所有相关的操作 XmlReader属性反映当前节点的值。

以下方法轻松导航节点和分析数据。

使用此 XmlReaderSettings 方法

目标

Read

读取的第一个节点,并一次前进流的一个节点。 此类调用通常执行内部 while 循环。

使用 NodeType 属性来获取当前节点的类型 (例如,属性、 注释、 元素和等等)。

Skip

跳过当前节点的子级,将移动到下一个节点。

MoveToContentMoveToContentAsync

跳过非内容节点并将移到下一个内容节点或文件结尾。

非内容节点包括 ProcessingInstruction, ,DocumentType, ,Comment, ,Whitespace, ,和 SignificantWhitespace

内容节点包括非空白文本、 CDATA, ,EntityReference , ,和EndEntity

ReadSubtree

读取元素及其所有子级,并返回一个新 XmlReader 实例设置为 ReadState.Initial

此方法可用于创建 XML 元素,则周围的边界例如,如果您想要将数据传递给另一个组件进行处理,并且你想要限制的数据量可以访问该组件。

请参阅 XmlReader.Read 举例说明如何导航文本流的一个节点通过一次并显示每个节点的类型的引用页。

以下各节描述了如何读取特定类型的数据,如元素、 属性和类型化数据。

下表列出的方法和属性, XmlReader 类提供了用于处理元素。XmlReader 置于某个元素上之后,节点属性(例如 Name)将反映元素的值。 除了下面所述的成员之外,XmlReader 类的任何常规方法和属性也可以用于处理元素。 例如,可以使用 ReadInnerXml 方法读取元素的内容。

System_CAPS_note说明

请参阅第 3.1 节的 W3C XML 1.0 Recommendation 有关开始标记的定义,结束标记和空元素标记。

使用此 XmlReader 成员

目标

IsStartElement 方法

检查当前节点是否是开始标记还是空元素标记。

ReadStartElement 方法

检查当前节点是一个元素,并使读取器前进到下一个节点 (调用 IsStartElementRead)。

ReadEndElement 方法

检查当前节点为结束标记,并使读取器前进到下一个节点。

ReadElementString 方法

读取纯文本元素。

ReadToDescendant 方法

将 XML 读取器前进到下一个具有指定的名称的后代 (子) 元素。

ReadToNextSibling 方法

将 XML 读取器前进到具有指定的名称的下一个同级元素。

IsEmptyElement 属性

检查当前元素是否为结束元素标记。 例如:

读取元素的文本内容的示例,请参阅 ReadString 方法。 下面的示例通过使用处理元素 while 循环。

while (reader.Read()) {
  if (reader.IsStartElement()) {
    if (reader.IsEmptyElement)
      Console.WriteLine("<{0}/>", reader.Name);
    else {
      Console.Write("<{0}> ", reader.Name);
      reader.Read(); // Read the start tag.
      if (reader.IsStartElement())  // Handle nested elements.
        Console.Write("\r\n<{0}>", reader.Name);
      Console.WriteLine(reader.ReadString());  //Read the text content of the element.
    }
  } 
} 

在元素中,最常发现 XML 特性,但它们还可以在 XML 声明和文档类型节点上。

当定位在元素节点上, MoveToAttribute 方法让你可以通过该元素的属性列表。 请注意,之后 MoveToAttribute 已调用,节点属性如 Name, ,NamespaceURI, ,和 Prefix 反映该属性的属性,不是该属性的元素的属性属于。

XmlReader 类提供了这些方法和属性来读取和处理的元素的属性。

使用此 XmlReader 成员

目标

HasAttributes 属性

检查当前节点是否有任何属性。

AttributeCount 属性

获取当前元素上的属性的数目。

MoveToFirstAttribute 方法

将移动到第一个元素的属性中。

MoveToNextAttribute 方法

将移动到下一个元素的属性中。

MoveToAttribute 方法

将移动到指定的属性。

GetAttribute 方法或 Item 属性

获取指定属性的值。

IsDefault 属性

检查当前节点是否是从 DTD 或架构中定义的默认值生成的属性。

MoveToElement 方法

将移动到拥有当前属性的元素。 此方法用于定位通过其特性后返回到该元素。

ReadAttributeValue 方法

将属性值分析为一个或多个 Text, ,EntityReference, ,或 EndEntity节点。

任何常规的 XmlReader 方法和属性也可以用于处理属性。 例如,在 XmlReader 位于某个属性上之后,NameValue 属性将反映该属性的值。 也可以使用任何内容 Read 方法来获取属性的值。

此示例使用 AttributeCount 属性来定位在元素上的所有属性。

// Display all attributes.
if (reader.HasAttributes) {
  Console.WriteLine("Attributes of <" + reader.Name + ">");
  for (int i = 0; i < reader.AttributeCount; i++) {
    Console.WriteLine("  {0}", reader[i]);
  }
  // Move the reader back to the element node.
  reader.MoveToElement(); 
}

此示例使用 MoveToNextAttribute 中的方法 while 循环来导航属性。

if (reader.HasAttributes) {
  Console.WriteLine("Attributes of <" + reader.Name + ">");
  while (reader.MoveToNextAttribute()) {
    Console.WriteLine(" {0}={1}", reader.Name, reader.Value);
  }
  // Move the reader back to the element node.
  reader.MoveToElement();
}

读取 XML 声明节点的属性

当 XML 读取器定位在 XML 声明节点上, Value 属性返回版本、 独立迁移以及作为单个字符串的编码信息。 XmlReader 创建的对象 Create 方法, XmlTextReader 类,和 XmlValidatingReader类公开版本、 独立和编码项作为属性。

读取文档类型节点的属性

当 XML 读取器定位在文档类型节点上, GetAttribute 方法和 Item 属性可以用于返回 SYSTEM 和 PUBLIC 文本的值。 例如,调用 reader.GetAttribute("PUBLIC") 将返回 PUBLIC 值。

读取在处理指令节点上的属性

XmlReader 位于某个处理指令节点上时,Value 属性将返回整个文本内容。 处理指令节点中的项不会被作为属性对待。 它们不能读取与 GetAttributeMoveToAttribute 方法。

XMLReader 类包括以下成员,从 XML 文件读取内容并返回的内容作为字符串值。 (若要返回的 CLR 类型,请参阅 下一节。)

使用此 XmlReader 成员

目标

Value 属性

获取当前节点的文本内容。 返回的值取决于节点类型;请参阅 Value 引用的详细信息页面。

ReadString 方法

获取作为字符串的元素或文本节点的内容。 此方法将在处理指令和注释停止。

有关此方法如何处理特定节点类型的详细信息,请参阅 ReadString 引用页面。

ReadInnerXmlReadInnerXmlAsync 方法

获取当前节点,包括标记,但不包括开始和结束标记的所有内容。 例如,适用于︰

<node>this<child id="123"/></node>

ReadInnerXml 返回︰

this<child id="123"/>

ReadOuterXmlReadOuterXmlAsync 方法

获取当前节点及其子级,包括标记和开始/结束标记的所有内容。 例如,适用于︰

<node>this<child id="123"/></node>

ReadOuterXml 返回︰

<node>this<child id="123"/></node>

您可以使用的成员 XmlReader 类 (在下表中列出) 来读取 XML 数据并返回作为公共语言运行时 (CLR) 类型,而不是字符串的值。 这些成员可以是最适合于您的编码任务而无需手动分析或转换的字符串值的表示形式获取值。

  • ReadElementContentAs 仅在元素节点类型上调用方法。 这些方法不能在包含子元素或混合内容的元素上使用。 在调用时,XmlReader 对象读取开始标记,读取元素内容,然后移过结束元素标记。 将忽略处理指令和注释并展开实体。

  • ReadContentAs方法读取读取器当前位置的文本内容,并根据 XML 数据不包含任何架构或数据类型信息与之关联,则会将文本内容转换请求的返回类型。 文本、空白、有效空白和 CDATA 节串联在一起。 跳过注释和处理指令,并自动解析实体引用。

XmlReader 类使用定义的规则 W3C XML Schema Part 2: Datatypes建议。

使用此 XmlReader方法

返回此 CLR 类型

ReadContentAsBooleanReadElementContentAsBoolean

Boolean

ReadContentAsDateTimeReadElementContentAsDateTime

DateTime

ReadContentAsDoubleReadElementContentAsDouble

Double

ReadContentAsLongReadElementContentAsLong

Int64

ReadContentAsIntReadElementContentAsInt

Int32

ReadContentAsStringReadElementContentAsString

String

ReadContentAsReadElementContentAs

使用指定的类型 returnType 参数

ReadContentAsObjectReadElementContentAsObject

最适合的类型,按照 XmlReader.ValueType 属性。 请参阅 System.Xml 类中的类型支持 映射信息。

如果元素不能轻松地转换为 CLR 类型由于其格式,可以使用架构映射以确保成功转换。 下面的示例使用一个.xsd 文件将转换 hire-date 到元素 xs:date 类型,然后使用 ReadElementContentAsDateTime 方法以返回元素作为 DateTime 对象。

输入 (hireDate.xml):

<employee xmlns="urn:empl-hire">
    <ID>12365</ID>
    <hire-date>2003-01-08</hire-date>
    <title>Accountant</title>
</employee>

架构 (hireDate.xsd):

<?xml version="1.0"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="urn:empl-hire" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="employee">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="ID" type="xs:unsignedShort" />
        <xs:element name="hire-date" type="xs:date" />
        <xs:element name="title" type="xs:string" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

代码︰

// Create a validating XmlReader object. The schema 
// provides the necessary type information.
XmlReaderSettings settings = new XmlReaderSettings();
settings.ValidationType = ValidationType.Schema;
settings.Schemas.Add("urn:empl-hire", "hireDate.xsd");
using (XmlReader reader = XmlReader.Create("hireDate.xml", settings)) {

  // Move to the hire-date element.
  reader.MoveToContent();
  reader.ReadToDescendant("hire-date");

  // Return the hire-date as a DateTime object.
  DateTime hireDate = reader.ReadElementContentAsDateTime();
  Console.WriteLine("Six Month Review Date: {0}", hireDate.AddMonths(6));
}

输出:

Six Month Review Date:  7/8/2003 12:00:00 AM

大部分 XmlReader 方法都具有异步对应项具有它们的方法名称末尾的"Async"。 例如,异步对等物的 ReadContentAsObjectReadContentAsObjectAsync

可以通过异步方法调用使用以下方法︰

以下各节描述了不具有异步对应的方法的用法。

ReadStartElement 方法

public static async Task ReadStartElementAsync(this XmlReader reader, string localname, string ns)
{
    if (await reader.MoveToContentAsync() != XmlNodeType.Element)
    {
        throw new InvalidOperationException(reader.NodeType.ToString() + " is an invalid XmlNodeType");
    }
    if ((reader.LocalName == localname) && (reader.NamespaceURI == ns))
    {
        await reader.ReadAsync();
    }
    else
    {
        throw new InvalidOperationException("localName or namespace doesn’t match");
    }
}

ReadEndElement 方法

public static async Task ReadEndElementAsync(this XmlReader reader)
{
    if (await reader.MoveToContentAsync() != XmlNodeType.EndElement)
    {
        throw new InvalidOperationException();
    }
    await reader.ReadAsync();
}

ReadToNextSibling 方法

public static async Task<bool> ReadToNextSiblingAsync(this XmlReader reader, string localName, string namespaceURI)
{
    if (localName == null || localName.Length == 0)
    {
        throw new ArgumentException("localName is empty or null");
    }
    if (namespaceURI == null)
    {
        throw new ArgumentNullException("namespaceURI");
    }

    // atomize local name and namespace
    localName = reader.NameTable.Add(localName);
    namespaceURI = reader.NameTable.Add(namespaceURI);

    // find the next sibling
    XmlNodeType nt;
    do
    {
        await reader.SkipAsync();
        if (reader.ReadState != ReadState.Interactive)
            break;
        nt = reader.NodeType;
        if (nt == XmlNodeType.Element &&
             ((object)localName == (object)reader.LocalName) &&
             ((object)namespaceURI ==(object)reader.NamespaceURI))
        {
            return true;
        }
    } while (nt != XmlNodeType.EndElement && !reader.EOF);

    return false;
}

ReadToFollowing 方法

public static async Task<bool> ReadToFollowingAsync(this XmlReader reader, string localName, string namespaceURI)
{
    if (localName == null || localName.Length == 0)
    {
        throw new ArgumentException("localName is empty or null");
    }
    if (namespaceURI == null)
    {
        throw new ArgumentNullException("namespaceURI");
    }

    // atomize local name and namespace
    localName = reader.NameTable.Add(localName);
    namespaceURI = reader.NameTable.Add(namespaceURI);

    // find element with that name
    while (await reader.ReadAsync())
    {
        if (reader.NodeType == XmlNodeType.Element && ((object)localName == (object)reader.LocalName) && ((object)namespaceURI == (object)reader.NamespaceURI))
        {
            return true;
        }
    }
    return false;
}

ReadToDescendant 方法

public static async Task<bool> ReadToDescendantAsync(this XmlReader reader, string localName, string namespaceURI)
{
    if (localName == null || localName.Length == 0)
    {
        throw new ArgumentException("localName is empty or null");
    }
    if (namespaceURI == null)
    {
        throw new ArgumentNullException("namespaceURI");
    }
    // save the element or root depth
    int parentDepth = reader.Depth;
    if (reader.NodeType != XmlNodeType.Element)
    {
        // adjust the depth if we are on root node
        if (reader.ReadState == ReadState.Initial)
        {
            parentDepth--;
        }
        else
        {
            return false;
        }
    }
    else if (reader.IsEmptyElement)
    {
        return false;
    }

    // atomize local name and namespace
    localName = reader.NameTable.Add(localName);
    namespaceURI = reader.NameTable.Add(namespaceURI);

    // find the descendant
    while (await reader.ReadAsync() && reader.Depth > parentDepth)
    {
        if (reader.NodeType == XmlNodeType.Element && ((object)localName == (object)reader.LocalName) && ((object)namespaceURI == (object)reader.NamespaceURI))
        {
            return true;
        }
    }
    return false;
}

在使用时,请考虑以下 XmlReader 类︰

  • 从引发的异常 XmlReader 可能会泄露冒泡到您的应用程序可能不希望的路径信息。 您的应用程序必须捕获异常并进行相应的处理。

  • 不要启用 DTD 处理,如果您不担心受到拒绝服务问题或所处理的是受信任的源。 默认情况下为禁用 DTD 处理 XmlReader 由创建的对象 Create 方法。

    如果启用了 DTD 处理,可以使用 XmlSecureResolver 限制 XmlReader 可以访问的资源。 此外可以设计您的应用程序,以使 XML 处理受内存和时间的约束。 例如,您可以在 ASP.NET 应用程序中配置超时限制。

  • XML 数据可以包含对外部资源(例如架构文件)的引用。 默认情况下,通过解析外部资源 XmlUrlResolver 使用没有用户凭据的对象。 通过执行下列操作之一,可以使此操作更加安全:

  • ProcessInlineSchemaProcessSchemaLocation 验证标志 XmlReaderSettings 对象不默认设置。 这样,在处理来自不可信的源的 XML 数据时,可以帮助防止 XmlReader 受到基于架构的攻击。 设置了这些标志后,XmlResolver 对象的 XmlReaderSettings 用于在 XmlReader 中解析实例文档中遇到的架构位置。 如果 XmlResolver 属性设置为 null, ,架构位置不是解析即使 ProcessInlineSchemaProcessSchemaLocation 加以验证标志。

    在验证过程中添加的架构会添加新类型,并且可能更改被验证的文档的验证结果。 因此,只应从可信的源解析外部架构。

    我们建议禁用 ProcessIdentityConstraints 标志时验证在根据架构对文档的很大程度的标识约束的高可用性方案的不可信的大 XML 文档。 默认情况下启用此标志。

  • XML 数据可以包含大量属性、命名空间声明、嵌套元素等,需要大量的时间来处理。 将发送到的输入的大小限制 XmlReader, ,您可以︰

  • ReadValueChunk 方法可用来处理大数据的数据流。 此方法一次读取少量的字符,而不是为整个值分配单个字符串。

  • 在读取 XML 文档具有大量唯一的本地名称、 命名空间或前缀时,可能出现的问题。 如果您使用的派生自的类 XmlReader, ,并且你调用 LocalName, ,Prefix, ,或 NamespaceURI 的每个项的属性,则返回的字符串添加到 NameTable 包含的集合 NameTable 绝不会减小大小,创建字符串句柄的虚拟内存泄漏。 缓解这是派生自 NameTable 类,并强制实施最大大小配额。 (没有没有办法来防止使用 NameTable, ,或切换 NameTable 已满时)。 另一种缓解是避免使用提到的属性,而是使用 MoveToAttribute 方法 IsStartElement 方法在可能的; 这些方法不返回的字符串和从而可以避免过度填充问题 NameTable 集合。

  • XmlReaderSettings 对象可以包含敏感信息,例如用户凭据。 不可信的组件可能会使用 XmlReaderSettings 对象及其用户凭据来创建 XmlReader 对象,以读取数据。 缓存时请小心 XmlReaderSettings 对象,或在传递时 XmlReaderSettings 到另一个组件中的对象。

  • 不接受来自不可信的源的支持组件,例如 NameTableXmlNamespaceManagerXmlResolver 对象。

下面的代码示例演示如何使用异步 APIto 分析 XML。

async Task TestReader(System.IO.Stream stream)
{
    XmlReaderSettings settings = new XmlReaderSettings();
    settings.Async = true;

    using (XmlReader reader = XmlReader.Create(stream, settings))
    {
        while (await reader.ReadAsync())
        {
            switch (reader.NodeType)
            {
                case XmlNodeType.Element:
                    Console.WriteLine("Start Element {0}", reader.Name);
                    break;
                case XmlNodeType.Text:
                    Console.WriteLine("Text Node: {0}",
                             await reader.GetValueAsync());
                    break;
                case XmlNodeType.EndElement:
                    Console.WriteLine("End Element {0}", reader.Name);
                    break;
                default:
                    Console.WriteLine("Other node {0} with value {1}",
                                    reader.NodeType, reader.Value);
                    break;
            }
        }
    }
}

通用 Windows 平台
自 8 起可用
.NET Framework
自 1.1 起可用
可移植类库
可移植 .NET 平台 中受支持
Silverlight
自 2.0 起可用
Windows Phone Silverlight
自 7.0 起可用
Windows Phone
自 8.1 起可用

此类型的所有公共静态(Visual Basic 中的 已共享 在 Visual Basic 中)成员都是线程安全的。不保证所有实例成员都是线程安全的。

返回页首
显示: