System.Xml 命名空间

提供基于标准的 XML 处理支持。

NameTable

实现单线程 XmlNameTable

UniqueId

为 GUID 优化的唯一标识符。

XmlAttribute

表示属性。 属性的有效值和默认值在文档类型定义 (DTD) 或架构中定义。

XmlAttributeCollection

表示可以按名称或索引访问的属性的集合。

XmlBinaryReaderSession

允许以动态方式管理经过优化的字符串。

XmlBinaryWriterSession

允许使用动态字典压缩消息中出现的常见字符串并保持状态。

XmlCDataSection

表示 CDATA 节。

XmlCharacterData

提供由几个类使用的文本操作方法。

XmlComment

表示 XML 注释的内容。

XmlConvert

对 XML 名称进行编码和解码,并提供方法在公共语言运行时类型和 XML 架构定义语言 (XSD) 类型之间进行转换。 转换数据类型时,返回的值是独立于区域设置的。

XmlDataDocument

允许通过相关的 DataSet 存储、检索和操作结构化数据。

XmlDeclaration

表示 XML 声明节点 <?xml version='1.0'...?>。

XmlDictionary

实现用于优化 Windows Communication Foundation (WCF) 的 XML 读取器/编写器实现的字典。

XmlDictionaryReader

Windows Communication Foundation (WCF) 从 XmlReader 中派生以便执行序列化和反序列化的 abstract 类。

XmlDictionaryReaderQuotas

包含 XmlDictionaryReaders 的可配置配额值。

XmlDictionaryString

表示存储在 XmlDictionary 中的项。

XmlDictionaryWriter

表示 Windows Communication Foundation (WCF) 从 XmlWriter 中派生的用于执行序列化和反序列化的一个抽象类。

XmlDocument

表示 XML 文档。 可使用此类在文档中加载、验证、编辑、添加和放置 XML。

XmlDocumentFragment

表示对树插入操作有用的轻量对象。

XmlDocumentType

表示文档类型声明。

XmlDocumentXPathExtensions

XmlDocumentXmlNode 提供扩展方法,以便用于进行文档导航。

XmlElement

表示元素。

XmlEntity

表示实体声明,如 <!ENTITY... >。

XmlEntityReference

表示实体引用节点。

XmlException

返回有关上一个异常的详细信息。

XmlImplementation

为一组 XmlDocument 对象定义上下文。

XmlLinkedNode

获取紧靠该节点(之前或之后)的节点。

XmlNamedNodeMap

表示可以按名称或索引访问的节点的集合。

XmlNamespaceManager

解析集合的命名空间、向集合添加命名空间和从集合中移除命名空间,以及提供对这些命名空间的范围管理。

XmlNameTable

原子化字符串对象表。

XmlNode

表示 XML 文档中的单个节点。

XmlNodeChangedEventArgs

提供以下事件的数据:NodeChangedNodeChangingNodeInsertedNodeInsertingNodeRemovedNodeRemoving

XmlNodeList

表示节点的有序集合。

XmlNodeReader

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

XmlNotation

表示符号声明,如 <!NOTATION... >。

XmlParserContext

提供 XmlReader 分析 XML 片段所需的所有上下文信息。

XmlProcessingInstruction

表示一条处理指令,XML 定义该处理指令以将处理器特定的信息保存在文档的文本中。

XmlQualifiedName

表示 XML 限定名称。

XmlReader

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

XmlReaderSettings

指定在由 XmlReader 方法创建的 Create 对象上支持的一组功能。

XmlResolver

解析由统一资源标识符 (URI) 命名的外部 XML 资源。

XmlSecureResolver

通过包装 XmlResolver 对象和限制基础 XmlResolver 有权访问的资源,帮助保护 XmlResolver 的另一个实现。

XmlSignificantWhitespace

表示在混合内容节点中标记之间的空白或 xml:space= 'preserve' 范围内的空白。 这也称为有效空白。

XmlText

表示元素或属性的文本内容。

XmlTextReader

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

从 .NET Framework 2.0 开始,建议改用 XmlReader 类。

XmlTextWriter

表示提供快速、非缓存、只进方法的写入器,该方法生成包含 XML 数据(这些数据符合 W3C 可扩展标记语言 (XML) 1.0 和“XML 命名空间”建议)的流或文件。

从 .NET Framework 2.0 开始,建议改用 XmlWriter 类。

XmlUrlResolver

解析由统一资源标识符 (URI) 命名的外部 XML 资源。

XmlValidatingReader

表示提供文档类型定义 (DTD)、XML 数据简化 (XDR) 架构和 XML 架构定义语言 (XSD) 验证的读取器。

此类已过时。 从 .NET Framework 2.0 开始,建议你使用 XmlReaderSettings 类和 Create 方法创建一个验证的 XML 读取器。

XmlWhitespace

表示元素内容中的空白。

XmlWriter

表示一个写入器,该写入器提供一种快速、非缓存和只进方式以生成包含 XML 数据的流或文件。

XmlWriterSettings

指定在由 XmlWriter 方法创建的 Create 对象上支持的一组功能。

XmlXapResolver

XmlXapResolver 类型用于解析 Silverlight 应用程序的 XAP 包中的资源。

接口

IApplicationResourceStreamResolver

表示应用程序资源流解析程序。

IFragmentCapableXmlDictionaryWriter

包含由 XmlDictionaryWriter 实现时允许处理 XML 片段的属性和方法。

IHasXmlNode

使类可以从当前上下文或位置返回 XmlNode

IStreamProvider

表示一个可以由提供流的类来实现的接口。

IXmlBinaryReaderInitializer

提供重新初始化二进制读取器以读取新文档的方法。

IXmlBinaryWriterInitializer

指定从此接口派生的 XML 二进制编写器的实现要求。

IXmlDictionary

一个定义必须实现 XML 字典以由 interfaceXmlDictionaryReader 实现使用这一协定的 XmlDictionaryWriter

IXmlLineInfo

提供一个使类可以返回行和位置信息的接口。

IXmlMtomReaderInitializer

指定从此接口派生的 XML MTOM 读取器的实现要求。

IXmlMtomWriterInitializer

当由 MTOM 编写器实现时,此接口可确保初始化 MTOM 编写器。

IXmlNamespaceResolver

提供对一组前缀和命名空间映射的只读访问。

IXmlTextReaderInitializer

指定从此接口派生的 XML 文本读取器的实现要求。

IXmlTextWriterInitializer

指定从此接口派生的 XML 文本编写器的实现要求。

枚举

ConformanceLevel

指定 XmlReaderXmlWriter 对象执行的输入或输出检查的量。

DtdProcessing

指定用于处理 DTD 的选项。 DtdProcessing 枚举由 XmlReaderSettings 类使用。

EntityHandling

指定 XmlTextReaderXmlValidatingReader 如何处理实体。

Formatting

指定 XmlTextWriter 的格式设置选项。

NamespaceHandling

指定是否在 XmlWriter 中移除重复的命名空间声明。

NewLineHandling

指定如何处理换行符。

ReadState

指定读取器的状态。

ValidationType

指定要执行的验证的类型。

WhitespaceHandling

指定如何处理空白。

WriteState

指定 XmlWriter 的状态。

XmlDateTimeSerializationMode

指定在字符串与 DateTime 之间转换时,如何处理时间值。

XmlDictionaryReaderQuotaTypes

枚举 XmlDictionaryReaders 的可配置配额值。

XmlNamespaceScope

定义命名空间范围。

XmlNodeChangedAction

指定节点更改的类型。

XmlNodeOrder

描述一个节点相对于另一个节点的文档顺序。

XmlNodeType

指定节点的类型。

XmlOutputMethod

指定用于序列化 XmlWriter 输出的方法。

XmlSpace

指定当前 xml:space 范围。

XmlTokenizedType

表示字符串的 XML 类型。 这允许以特定 XML 类型(例如 CDATA 节类型)的形式读取字符串。

委托

OnXmlDictionaryReaderClose

关闭读取器时回调方法的 delegate

XmlNodeChangedEventHandler

表示处理以下事件的方法:NodeChangedNodeChangingNodeInsertedNodeInsertingNodeRemovedNodeRemoving

注解

支持的标准

System.Xml命名空间支持以下标准:

请参阅 w3c 规范与 w3c 规范的区别 部分,其中的两种情况下的 XML 类不同于 w3c 建议。

.NET 还为 XML 相关操作提供了其他命名空间。 有关列表、说明和链接,请参阅 System.Xml 命名空间

异步处理 XML

System.Xml.XmlReaderSystem.Xml.XmlWriter 类包括许多基于异步编程模型的异步方法。 这些方法可以通过其名称末尾的字符串 "Async" 进行标识。 利用这些方法,你可以编写类似于同步代码的异步代码,并可以轻松地将现有同步代码迁移到异步代码。

  • 在具有大量网络流延迟的应用程序中使用异步方法。 避免使用异步 Api 进行内存流或本地文件流读/写操作。 输入流、 XmlTextReaderXmlTextWriter 应该也支持异步操作。 否则,i/o 操作仍将阻止线程。

  • 我们不建议混合使用同步和异步函数调用,因为你可能会忘记使用 await 关键字或使用同步 API (在这种情况下需要使用异步的)。

  • XmlReaderSettings.Async XmlWriterSettings.Async true 如果不打算使用异步方法,请不要将或标记设置为。

  • 如果在 await 调用异步方法时忘记指定关键字,则结果是不确定的:你可能会收到预期结果或异常。

  • XmlReader 对象读取大文本节点时,它可能仅缓存部分文本值并且返回文本节点,因此,在检索 XmlReader.Value 属性时,可能会被 i/o 操作阻止。 使用 XmlReader.GetValueAsync 方法可获取异步模式下的文本值,或使用 XmlReader.ReadValueChunkAsync 方法读取块区中的大型文本块。

  • 使用 XmlWriter 对象时,请在 XmlWriter.FlushAsync 调用之前调用方法, XmlWriter.Close 以避免阻塞 i/o 操作。

与 W3C 规范的区别

在两个涉及模型组架构组件的约束的情况下, System.Xml 命名空间不同于 W3C 建议。

元素声明中的一致性:

在某些情况下,当使用替代组时, System.Xml 实现不满足 "架构组件约束:元素声明的一致性" 这一点,详见 W3C 规范的 " 模型组架构组件约束 " 部分。

例如,下面的架构包含名称相同但在同一内容模型中具有不同类型的元素,并且使用了替换组。 这应该会导致错误,但是 System.Xml 能够正确编译和验证该架构,而不会出错。

<?xml version="1.0" encoding="utf-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">

   <xs:element name="e1" type="t1"/>
   <xs:complexType name="t1"/>

   <xs:element name="e2" type="t2" substitutionGroup="e1"/>
      <xs:complexType name="t2">
         <xs:complexContent>
            <xs:extension base="t1">
         </xs:extension>
      </xs:complexContent>
   </xs:complexType>

   <xs:complexType name="t3">
      <xs:sequence>
         <xs:element ref="e1"/>
         <xs:element name="e2" type="xs:int"/>
      </xs:sequence>
   </xs:complexType>
</xs:schema>

在此架构中,t3 类型包含一个元素序列。 由于使用了替换,从序列中对元素 e1 的引用会导致类型为 e1 的元素 t1 或类型为 e2 的元素 t2。 后一种情况会产生两个元素的序列 e2 ,其中一个元素的类型为 t2 ,另一个的类型为 xs:int

唯一粒子归属:

在以下条件下, System.Xml 实现不满足 "架构组件约束:唯一粒子归属",这在 W3C 规范的 " 模型组架构组件的约束 " 部分中进行了介绍。

  • 组中的某个元素引用另一个元素。

  • 被引用的元素是替换组的头元素。

  • 替换组包含与组中的一个元素同名的元素。

  • 引用替换组头元素的元素基数与替换组元素同名的元素不会固定 (minOccurs < maxOccurs) 。

  • 引用替换组的元素的定义位于与替换组元素同名的元素的定义之前。

例如,在下面的架构中,内容模型有歧义,应该会导致编译错误,但是 System.Xml 能够正确编译该架构,而不会出错。

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">

  <xs:element name="e1" type="xs:int"/>
  <xs:element name="e2" type="xs:int" substitutionGroup="e1"/>

  <xs:complexType name="t3">
    <xs:sequence>
      <xs:element ref="e1" minOccurs="0" maxOccurs="1"/>
      <xs:element name="e2" type="xs:int" minOccurs="0" maxOccurs="1"/>
    </xs:sequence>
  </xs:complexType>

  <xs:element name="e3" type="t3"/>
</xs:schema>

如果尝试针对上述架构验证以下 XML,验证将失败,并出现以下消息: "元素 ' e3 ' 具有无效的子元素 ' e2 '。", XmlSchemaValidationException 将引发异常。

<e3>
  <e2>1</e2>
  <e2>2</e2>
</e3>

若要解决此问题,可以在 XSD 文档中交换元素声明。 例如:

<xs:sequence>
  <xs:element ref="e1" minOccurs="0" maxOccurs="1"/>
  <xs:element name="e2" type="xs:int" minOccurs="0" maxOccurs="1"/>
</xs:sequence>

变为:

<xs:sequence>
  <xs:element name="e2" type="xs:int" minOccurs="0" maxOccurs="1"/>
  <xs:element ref="e1" minOccurs="0" maxOccurs="1"/>
</xs:sequence>

下面是同一问题的另一个示例:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
   <xs:element name="e1" type="xs:string"/>
   <xs:element name="e2" type="xs:string" substitutionGroup="e1"/>

   <xs:complexType name="t3">
      <xs:sequence>
         <xs:element ref="e1" minOccurs="0" maxOccurs="1"/>
         <xs:element name="e2" type="xs:int" minOccurs="0" maxOccurs="1"/>
      </xs:sequence>
   </xs:complexType>
   <xs:element name="e3" type="t3"/>
</xs:schema>

如果尝试针对上述架构验证以下 XML,验证将失败,并出现以下异常: "未经处理的异常: System.Xml.Schema.XmlSchemaValidationException:" e2 "el 元素无效-根据其数据类型,值" abc "无效, 'http://www.w3.org/2001/XMLSchema:int' 字符串" abc "不是有效的 Int32 值。

<e3><e2>abc</e2></e3>

安全注意事项

命名空间中的类型和成员 System.Xml 依赖于 .net 安全系统。 以下部分介绍了特定于 XML 技术的安全问题。

另请注意,当你使用 System.Xml 类型和成员时,如果 XML 包含有潜在的隐私隐患的数据,则需要以一种与最终用户的隐私相关的方式实现应用。

外部访问

多项 XML 技术可以在处理期间检索其他文档。 例如,文档类型定义 (DTD) 可以驻留在正在分析的文档中。 DTD 还可以驻留在正在分析的文档所引用的外部文档中。 XML 架构定义语言 (XSD) 和 XSLT 技术还可以包括其他文件中的信息。 这些外部资源可能存在一些安全问题。 例如,你将需要确保你的应用只从受信任的站点检索文件,并且该应用程序检索的文件不包含恶意数据。

XmlUrlResolver类用于加载 XML 文档和解析外部资源(如实体、dtd 或架构)以及导入或包含指令。

您可以重写此类并指定 XmlResolver 要使用的对象。 如果需要打开自己无法控制的或不可信的资源,请使用 XmlSecureResolver 类。 XmlSecureResolver 包装 XmlResolver 并允许您限制基础 XmlResolver 有权访问的资源。

拒绝服务

下列方案被认为不太容易受到拒绝服务攻击,原因是 System.Xml 类可以防止受到此类攻击。

如果担心受到拒绝服务攻击,或处于不可信的环境下,建议不要使用下列方案。

  • DTD 处理。

  • 架构处理。 这涉及到将不可信架构添加到架构集合中、编译不可信架构以及使用不可信架构进行验证。

  • XSLT 处理。

  • 分析用户提供的二进制 XML 数据的任意流。

  • DOM 操作,例如查询、编辑、在文档之间移动子树以及保存 DOM 对象。

如果你担心拒绝服务问题,或者如果你正在处理不受信任的源,则不要启用 DTD 处理。 默认情况下,此方法在该 XmlReader 方法创建的对象上处于禁用状态 XmlReader.Create

备注

默认情况下,XmlTextReader 允许进行 DTD 处理。 可以使用 XmlTextReader.DtdProcessing 属性禁用此功能。

如果已启用 DTD 处理,则可以使用 XmlSecureResolver 类来限制 XmlReader 可以访问的资源。 你还可以设计应用程序,以便 XML 处理的内存和时间受到限制。 例如,可以在 ASP.NET 应用程序中配置超时限制。

处理注意事项

由于 XML 文档可以包含对其他文件的引用,因此,很难确定分析 XML 文档所需的处理能力。 例如,XML 文档可以包括 DTD。 如果 DTD 包含嵌套实体或复杂内容模型,可能需要大量时间来分析文档。

使用 XmlReader 时,通过设置 XmlReaderSettings.MaxCharactersInDocument 属性,您可以限制能够分析的文档大小。 通过设置 XmlReaderSettings.MaxCharactersFromEntities 属性,您可以限制从扩展实体中生成的字符数。 有关设置这些属性的示例,请参见相应的参考主题。

XSD 和 XSLT 技术具有其他一些可能影响处理性能的功能。 例如,在计算相对较小的文档时,构造的 XML 架构可能需要大量的时间来处理。 还可能会在 XSLT 样式表中嵌入脚本块。 这两种情况都会给应用带来潜在的安全威胁。

创建使用类的应用时 XslCompiledTransform ,应注意以下各项及其含义:

  • 默认情况下禁用 XSLT 脚本。 只有要求脚本支持并且处于完全可信的环境下时,才应启用 XSLT 脚本。

  • 默认情况下禁用 XSLT document() 函数。 如果启用 document() 函数,通过将 XmlSecureResolver 对象传递给 XslCompiledTransform.Transform 方法,限制可以访问的资源。

  • 默认情况下启用扩展对象。 如果包含扩展对象的 XsltArgumentList 对象传递给 XslCompiledTransform.Transform 方法,将使用这些扩展对象。

  • XSLT 样式表可以包括对其他文件的引用以及嵌入式脚本块。 恶意用户可能会利用这一点,方法是为您提供数据或样式表,在执行时,可能会使您的系统不断进行处理,直到计算机资源不足。

  • 在混合信任环境中运行的 XSLT 应用可能会导致样式表欺骗。 例如,恶意用户可能会为对象加载有害的样式表,并将其交给另一个用户,而后者会继续调用 XslCompiledTransform.Transform 方法并执行转换。

如果不启用脚本或 document() 函数(除非样式表来自可信的源),或不接受来自不可信的源的 XslCompiledTransform 对象、XSLT 样式表或 XML 源数据,可以缓解这些安全问题。

异常处理

较低级别组件引发的异常可能会泄露不希望向应用公开的路径信息。 应用必须捕获异常并适当地处理它们。

另请参阅