XmlValidatingReader 类可以通过将字符串当作 XML 的片段分析来读取 XML 片段。
![]() |
---|
XmlValidatingReader 类在 .NET Framework 2.0 版 中已过期。您可以使用 XmlReaderSettings 类和 Create 方法创建一个验证 XmlReader 实例。有关更多信息,请参见使用 XmlReader 验证 XML 数据。 |
XmlParserContext 类
XmlParserContext 类用于构造 XmlValidatingReader 对象,其中包含分析 XML 片断或文档时所需的上下文信息。 XmlParserContext 类可以提供要使用的 XmlNameTable、命名空间范围、文档类型定义 (DTD)、编码以及当前的 xml:lang 和 xml:space 范围等信息。
在构造 XmlValidatingReader 对象时,必须还要指定 XML 节点类型。 XML 节点类型确定数据将作为片断还是作为格式正确的 XML 文档来进行分析。 下表列出了节点类型以及分析器所需的数据类型。 传入任何其他 XmlNodeType 值都将引发 ArgumentException。
类型 |
片段包含 |
---|---|
Element |
任何有效的元素内容(包括元素、注释、处理指令、CDATA 和文本的组合)。 XML 声明也可以作为第一个节点出现。 这样可以指定 XML 片断的编码。 |
Attribute |
属性的值。 |
Document |
整个 XML 文档的内容。 此类型强制执行 XML 正确格式的文档规则。 |
在元素或属性内容中找到的实体引用根据 EntityHandling 标志来处理。 可以通过使用 XmlParserContext 类,传递用于解析实体和添加默认属性的 DTD 信息。
如果 ValidationType 属性设置为 DTD 或 Auto,则需要包含 PUBLIC 文本、SYSTEM 文本和内部 DTD 子集的 XmlParserContext 构造函数,并且解析实体和添加默认属性至关重要。 对于所有其他验证类型,可以提供没有 DTD 属性的 XmlParserContext(如架构)。 任何用于验证 XML 片断的架构必须或者添加到 XmlSchemaCollection 中,或者在 XML 片断中直接引用。 XmlParserContext 用于为分析 XML 片断提供更多所需的信息,如命名空间解析、DTD 信息等。
如果 ValidationType 属性设置为 DTD 并且 XmlParserContext 不包含任何 DTD 属性,则会发生 ArgumentException。
示例
下面的代码示例使用 XmlValidatingReader 读取 XML 片断并将它们写到控制台。
Imports System
Imports System.Xml
Public Class Sample
Overloads Public Shared Sub Main(args() As [String])
Dim vr As New XmlValidatingReader("<element1> abc </element1> <element2> qrt </element2> <?pi asldfjsd ?> <!-- comment -->", XmlNodeType.Element, Nothing)
While vr.Read()
Console.WriteLine("NodeType: {0} NodeName: {1}", vr.NodeType, vr.Name)
End While
End Sub
' Main
End Class
' Sample
using System;
using System.Xml;
public class Sample
{
public static void Main (String[] args)
{
XmlValidatingReader vr = new XmlValidatingReader("<element1> abc </element1> <element2> qrt </element2> <?pi asldfjsd ?> <!-- comment -->", XmlNodeType.Element, null);
while(vr.Read())
Console.WriteLine("NodeType: {0} NodeName: {1}", vr.NodeType, vr.Name);
}
}
下面的代码示例使用 XmlParserContext 读取 XML 片断,以便从 XmlNamespaceManager 提供所需的命名空间。
Imports System
Imports System.IO
Imports System.Xml
Public Class Sample
Public Shared Sub Main()
Dim xmlFrag As String = "<book><bk:genre>&n;</bk:genre></book>"
Dim nt As New NameTable()
Dim nsmanager As New XmlNamespaceManager(nt)
' Add a default namespace.
nsmanager.AddNamespace(String.Empty, "www.microsoft.com")
nsmanager.AddNamespace("bk", "www.microsoft.com/books")
Dim internalContent As String = "<!ENTITY n 'novel'>"
Dim context As New XmlParserContext(nt, nsmanager, "elem", Nothing, Nothing, internalContent, String.Empty, String.Empty, XmlSpace.None)
Dim r As New XmlValidatingReader(xmlFrag, XmlNodeType.Element, context)
r.ValidationType = ValidationType.None
r.EntityHandling = EntityHandling.ExpandEntities
While r.Read()
Console.WriteLine("{0},{1},{2}", r.NodeType, r.Name, r.Value)
End While
End Sub
' Main
End Class
' Sample
using System;
using System.IO;
using System.Xml;
public class Sample
{
public static void Main()
{
string xmlFrag = "<book><bk:genre>&n;</bk:genre></book>";
NameTable nt = new NameTable();
XmlNamespaceManager nsmanager = new XmlNamespaceManager(nt);
// Add a default namespace.
nsmanager.AddNamespace (string.Empty, "www.microsoft.com");
nsmanager.AddNamespace ("bk", "www.microsoft.com/books");
string internalContent = "<!ENTITY n 'novel'>";
XmlParserContext context = new XmlParserContext(nt, nsmanager, "elem",null, null, internalContent, string.Empty,
string.Empty, XmlSpace.None);
XmlValidatingReader r = new XmlValidatingReader(xmlFrag, XmlNodeType.Element, context);
r.ValidationType = ValidationType.None;
r.EntityHandling = EntityHandling.ExpandEntities;
while(r.Read())
Console.WriteLine("{0},{1},{2}",r.NodeType, r.Name, r.Value);
}
}
当 ValidationType 属性设置为 DTD 时,不能进行片断分析,这是因为根据定义,DTD 要求加载整个文档才能执行验证。