System.Xml 命名空间
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
为处理 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 |
|
| XmlDictionaryReaderQuotas |
包含 XmlDictionaryReaders 的可配置配额值。 |
| XmlDictionaryString |
表示存储在 .. 中的 XmlDictionary条目。 |
| XmlDictionaryWriter |
表示 Windows Communication Foundation (WCF) 派生自 XmlWriter 进行序列化和反序列化的抽象类。 |
| XmlDocument |
表示 XML 文档。 可以使用此类在文档中加载、验证、编辑、添加和定位 XML。 |
| XmlDocumentFragment |
表示可用于树插入操作的轻型对象。 |
| XmlDocumentType |
表示文档类型声明。 |
| XmlDocumentXPathExtensions |
提供文档 XmlDocument 导航和 XmlNode 文档导航的扩展方法。 |
| XmlElement |
表示元素。 |
| XmlEntity |
表示实体声明,例如 <!ENTITY... > |
| XmlEntityReference |
表示实体引用节点。 |
| XmlException |
返回有关最后一个异常的详细信息。 |
| XmlImplementation |
定义一组 XmlDocument 对象的上下文。 |
| XmlLinkedNode |
获取紧接在此节点之前或之后的节点。 |
| XmlNamedNodeMap |
表示可通过名称或索引访问的节点的集合。 |
| XmlNamespaceManager |
解析、添加和删除集合中的命名空间,并为这些命名空间提供范围管理。 |
| XmlNameTable |
原子化字符串对象的表。 |
| XmlNode |
表示 XML 文档中的单个节点。 |
| XmlNodeChangedEventArgs |
为、NodeChanging、 NodeRemovedNodeInsertedNodeInserting和NodeRemoving事件提供数据。NodeChanged |
| XmlNodeList |
表示节点的有序集合。 |
| XmlNodeReader |
表示一个读取器,该读取器提供快速的非缓存转发仅对 XML 数据的访问权限 XmlNode。 |
| XmlNotation |
表示表示法声明,例如 <!表示法... > |
| XmlParserContext |
提供分析 XML 片段所需的所有 XmlReader 上下文信息。 |
| XmlProcessingInstruction |
表示处理指令,XML 定义将处理器特定的信息保留在文档的文本中。 |
| XmlQualifiedName |
表示 XML 限定名称。 |
| XmlReader |
表示提供对 XML 数据的快速、非缓存、仅向前访问的读取器。 |
| XmlReaderSettings | |
| XmlResolver |
解析由统一资源标识符(URI)命名的外部 XML 资源。 |
| XmlSecureResolver |
通过包装XmlResolver对象并限制基础XmlResolver有权访问的资源,帮助保护另一种XmlResolver实现。 |
| XmlSignificantWhitespace |
表示混合内容节点中的标记或 xml:space= “preserve” 作用域内的空白。 这也称为重要的空白。 |
| XmlText |
表示元素或属性的文本内容。 |
| XmlTextReader |
表示提供对 XML 数据的快速、非缓存、仅向前访问的读取器。 建议改用 XmlReader 类。 |
| XmlTextWriter |
表示一个编写器,该编写器提供快速、非缓存的、仅向前的方法来生成包含符合 W3C 可扩展标记语言 (XML) 1.0 和 XML 建议中的命名空间的 XML 数据的文件。 建议改用 XmlWriter 类。 |
| XmlUrlResolver |
解析由统一资源标识符(URI)命名的外部 XML 资源。 |
| XmlValidatingReader |
表示提供文档类型定义(DTD)、XML-Data 缩减(XDR)架构和 XML 架构定义语言(XSD)验证的读取器。 此类已过时。 建议使用 XmlReaderSettings 类和 Create 方法创建验证 XML 读取器。 |
| XmlWhitespace |
表示元素内容中的空白。 |
| XmlWriter |
表示一个编写器,该编写器提供快速、非缓存的仅向前方式来生成包含 XML 数据的流或文件。 |
| XmlWriterSettings | |
| XmlXapResolver |
XmlXapResolver 类型用于解析 Silverlight 应用程序的 XAP 包中的资源。 |
接口
| 名称 | 说明 |
|---|---|
| IApplicationResourceStreamResolver |
表示应用程序资源流解析程序。 |
| IFragmentCapableXmlDictionaryWriter |
包含属性和方法,当通过 a XmlDictionaryWriter实现时,允许处理 XML 片段。 |
| IHasXmlNode |
使类能够从当前上下文或位置返回一个 XmlNode 。 |
| IStreamProvider |
表示可由提供流的类实现的接口。 |
| IXmlBinaryReaderInitializer |
提供用于重新初始化二进制读取器以读取新文档的方法。 |
| IXmlBinaryWriterInitializer |
指定派生自此接口的 XML 二进制编写器的实现要求。 |
| IXmlDictionary |
一个 |
| IXmlLineInfo |
提供一个接口,使类能够返回行和位置信息。 |
| IXmlMtomReaderInitializer |
指定从此接口派生的 XML MTOM 读取器的实现要求。 |
| IXmlMtomWriterInitializer |
当由 MTOM 编写器实现时,此接口可确保 MTOM 编写器的初始化。 |
| IXmlNamespaceResolver |
提供对一组前缀和命名空间映射的只读访问权限。 |
| IXmlTextReaderInitializer |
指定从此接口派生的 XML 文本读取器的实现要求。 |
| IXmlTextWriterInitializer |
指定派生自此接口的 XML 文本编写器的实现要求。 |
枚举
| 名称 | 说明 |
|---|---|
| ConformanceLevel | |
| DtdProcessing |
指定用于处理 DTD 的选项。 DtdProcessing 类使用 XmlReaderSettings 枚举。 |
| EntityHandling |
指定 XmlTextReader 或 XmlValidatingReader 如何处理实体。 |
| Formatting |
指定 XmlTextWriter的格式设置选项。 |
| NamespaceHandling |
指定是否删除 XmlWriter中的重复命名空间声明。 |
| NewLineHandling |
指定如何处理换行符。 |
| ReadState |
指定读取器的状态。 |
| ValidationType |
指定要执行的验证类型。 |
| WhitespaceHandling |
指定如何处理空格。 |
| WriteState |
指定 XmlWriter的状态。 |
| XmlDateTimeSerializationMode |
指定在字符串和 DateTime之间转换时如何处理时间值。 |
| XmlDictionaryReaderQuotaTypes |
枚举 XmlDictionaryReaders 的可配置配额值。 |
| XmlNamespaceScope |
定义命名空间范围。 |
| XmlNodeChangedAction |
指定节点更改的类型。 |
| XmlNodeOrder |
描述节点与第二个节点相比的文档顺序。 |
| XmlNodeType |
指定节点的类型。 |
| XmlOutputMethod |
指定用于序列化 XmlWriter 输出的方法。 |
| XmlSpace |
指定当前 |
| XmlTokenizedType |
表示字符串的 XML 类型。 这允许将字符串读取为特定 XML 类型,例如 CDATA 节类型。 |
委托
| 名称 | 说明 |
|---|---|
| OnXmlDictionaryReaderClose |
|
| XmlNodeChangedEventHandler |
表示处理NodeChanged、NodeChanging、NodeInserted和 NodeInsertingNodeRemovedNodeRemoving事件的方法。 |
注解
支持的标准
命名空间 System.Xml 支持以下标准:
有关 XML 类不同于 W3C 建议的两种情况,请参阅 W3C 规范的差异 部分。
异步处理 XML
这些 System.Xml.XmlReader 和 System.Xml.XmlWriter 类包括许多基于异步编程模型的异步方法。 这些方法可以通过字符串“Async”在其名称末尾进行标识。 使用这些方法,可以编写类似于同步代码的异步代码,并且可以轻松地将现有同步代码迁移到异步代码。
在存在重大网络流延迟的应用中使用异步方法。 避免将异步 API 用于内存流或本地文件流读/写操作。 输入流 XmlTextReader,还应 XmlTextWriter 支持异步操作。 否则,I/O 操作仍会阻止线程。
不建议混合同步和异步函数调用,因为你可能忘记了使用
await关键字或使用同步 API,其中需要异步函数。如果不打算使用异步方法,请不要设置 XmlReaderSettings.Async 或 XmlWriterSettings.Async 标记
true。如果在调用异步方法时忘记指定
await关键字,则结果是不确定的:可能会收到预期的结果或异常。当对象 XmlReader 读取大型文本节点时,它可能只缓存部分文本值并返回文本节点,因此 XmlReader.Value 检索属性可能会被 I/O 操作阻止。 XmlReader.GetValueAsync使用该方法在异步模式下获取文本值,或使用XmlReader.ReadValueChunkAsync该方法读取区块中的大型文本块。
使用XmlWriter对象时,在调用XmlWriter.Close之前调用XmlWriter.FlushAsync该方法以避免阻止 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的引用可能会导致类型t1或类型t2元素中的元素e1e2。 后一种情况会导致两 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 类提供了防止此类攻击的方法。
分析文本 XML 数据。
如果二进制 XML 数据是由 Microsoft SQL Server 生成的,则分析二进制 XML 数据。
将 XML 文档和片段从数据源写入文件系统、流、或 TextWriter文件系统 StringBuilder。
如果使用
对象并 设置为 ,请将文档加载到文档对象模型 (DOM) 对象中。 导航 DOM 对象。
如果你担心拒绝服务攻击,或者你在不受信任的环境中工作,则不建议使用以下方案。
DTD 处理。
架构处理。 这包括将不受信任的架构添加到架构集合、编译不受信任的架构以及使用不受信任的架构进行验证。
XSLT 处理。
分析用户提供二进制 XML 数据的任何任意流。
DOM 操作,例如查询、编辑、在文档之间移动子树以及保存 DOM 对象。
如果担心拒绝服务问题或处理不受信任的源,请不要启用 DTD 处理。 此方法创建的对象XmlReader.Create默认XmlReader禁用此功能。
注释
默认情况下, 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()函数,除非样式表来自受信任的源,并且不接受来自不受信任的源的对象、XSLT 样式表或 XML 源数据,可以缓解这些安全问题。
异常处理
较低级别组件引发的异常可以披露不希望向应用公开的路径信息。 你的应用必须捕获异常并相应地处理它们。