如何用 Visual C#.net 中的 DTD、 XDR,或 XSD 验证 XML 文档

本文演示了如何将文档类型定义 (DTD)、 一个 Microsoft XML 数据缩减 (XDR) 架构或 XML 架构定义语言 (XSD) 架构应用到一个可扩展标记语言 (XML) 文档。本文还介绍了如何使用XmlValidatingReader 类来验证指定的语法对 XML 文档,以及如何使用在内存中缓存的架构XmlSchemaCollection 类,以优化 XML 验证。

XML 文档包含的元素和属性。它们提供灵活且功能强大的一种方法中,应用程序和组织之间交换数据。若要指定允许的结构和内容的 XML 文档,您可以编写一个 DTD、 一个的 XDR 架构或 XSD 架构。XSD 架构是首选的方法若要指定在 Microsoft.net 框架但 dtd 的 XML 语法,还支持 XDR 架构。

回到顶端
要求
本文假定您熟悉下列主题:
Microsoft Visual C#.net 或 Microsoft Visual Basic.net 语法
包括验证问题的 XML 概念
回到顶端
创建 XML 文档
启动 Visual Studio.net。
创建新的 XML 文件在本地计算机上。
对 XML 文档,以表示一种产品目录中的添加以下数据:
<Product ProductID="123"> <ProductName>Rugby jersey</ProductName> </Product>
保存该文件作为 Product.xml 在新的文件夹中名为 C:/MyFolder。
回到顶端
使用该 DTD
创建 DTD,并链接到 XML 文档
在 Visual Studio.net 中,创建一个空文本文件。
将下面的 DTD 声明添加到该文件描述 XML 文档的语法:
<!ELEMENT Product (ProductName)> <!ATTLIST Product ProductID CDATA #REQUIRED> <!ELEMENT ProductName (#PCDATA)>

将文件另存为中将 C:/MyFolder Product.dtd 目录。
在 Visual Studio.net 中打开 Product.xml。
Product.xml 要链接到 DTD 文件的 XML 文档的顶部添加下面的 DOCTYPE 语句:
<?xml version="1.0"?> <!DOCTYPE Product SYSTEM "Product.dtd">

将修改后的 XML 文档保存为 ProductWithDTD.xml。
使用 DTD 验证 XML 文档
在 Visual Studio.net 中,创建一个新 Visual C# 控制台应用程序项目命名 ValidateXml。
将两个 using 语句添加到 Class1.cs 的开头,如下所示:
using System.Xml; // for XmlTextReader and XmlValidatingReader using System.Xml.Schema; // for XmlSchemaCollection (which is used later)

Class1.cs,在声明布尔型变量,如下所示命名 isValidMain 方法的开始之前:
private static bool isValid = true; // If a validation error occurs, // set this flag to false in the // validation event handler.  
创建要从 Main 方法中的文本文件中读取 XML 文档的 XmlTextReader 对象,然后创建一个XmlValidatingReader 来验证此 XML 数据,如下所示:
XmlTextReader r = new XmlTextReader("C://MyFolder//ProductWithDTD.xml"); XmlValidatingReader v = new XmlValidatingReader(r);

ValidationTypeXmlValidatingReader 对象的属性指示需要 (DTD、 XDR 或 架构) 的有效性规则的类型。将此属性设置为 DTD,如下所示:
v.ValidationType = ValidationType.DTD;

如果发生任何验证错误,验证读取器将生成一个验证事件。添加以下代码以注册验证事件处理程序 (MyValidationEventHandler 方法中实现第 8 步):
v.ValidationEventHandler += new ValidationEventHandler(MyValidationEventHandler);

添加以下代码以读取和验证 XML 文档。如果发生任何验证错误,MyValidationEventHandler 的调用,以解决该错误。此方法将 isValid 设置为 false (请参阅第 8 步)。您可以验证文档是否有效或无效后检查 isValid 的状态
while (v.Read()) { // Can add code here to process the content. } v.Close(); // Check whether the document is valid or invalid. if (isValid) Console.WriteLine("Document is valid"); else Console.WriteLine("Document is invalid");

Main 方法之后,写入 MyValidationEventHandler 方法,如下所示:
public static void MyValidationEventHandler(object sender, ValidationEventArgs args) { isValid = false; Console.WriteLine("Validation event/n" + args.Message); }
生成并运行该应用程序。应用程序应报告的 XML 文档有效。
在 Visual Studio.net 中,修改 ProductWithDTD.xml 以使它无效 (例如对于删除该"<productname>橄榄球运动衫</productname>"元素)。
再次运行该应用程序。您应收到以下错误消息:
验证事件
元素产品具有无效的内容。应为产品名称。
在 file:///C:/MyFolder/ProductWithDTD.xml(4, 5) 时,出现了一个错误。
是无效的文档
回到顶端
使用 XDR 架构
创建 XDR 架构并链接到 XML 文档
在 Visual Studio.net 中,创建一个空文本文件。
将下面的 XDR 架构定义添加到该文件描述 XML 文档的语法:
<?xml version="1.0"?> <Schema name="ProductSchema" xmlns="urn:schemas-microsoft-com:xml-data" xmlns:dt="urn:schemas-microsoft-com:datatypes"> <ElementType name="Product" content="eltOnly"> <attribute type="ProductID" required="yes"/> <element type="ProductName"/> </ElementType> <AttributeType name="ProductID" dt:type="int"/> <ElementType name="ProductName" dt:type="string"/> </Schema>

将文件另存为中将 C:/MyFolder Product.xdr 目录。
打开 Product.xml 源文件并将其链接到在 XDR 架构,如下所示:
<?xml version="1.0"?> <Product ProductID="123" xmlns="x-schema:Product.xdr"> <ProductName>Rugby jersey</ProductName> </Product>

将修改后的 XML 文档保存为 ProductWithXDR.xml。
使用 XDR 架构验证 XML 文档
修改您的应用程序,以便 XmlTextReader 加载 ProductWithXDR.xml,如下所示:
XmlTextReader r = new XmlTextReader("C://MyFolder//ProductWithXDR.xml");

XDR 到设置 ValidationType,以便验证读取器执行 XDR 验证:
v.ValidationType = ValidationType.XDR;

生成并运行该应用程序。应用程序应报告的 XML 文档有效。
修改 ProductWithXDR.xml 以使它无效。
生成并再次运行该应用程序。您应该会收到验证错误。
回到顶端
使用 XSD 架构
创建 XSD 架构并链接到 XML 文档
在 Visual Studio.net 中,创建一个空文本文件。
将以下 XSD 架构定义添加到该文件描述 XML 文档的语法:
<?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="Product"> <xsd:complexType> <xsd:sequence> <xsd:element name="ProductName" type="xsd:string"/> </xsd:sequence> <xsd:attribute name="ProductID" use="required" type="xsd:int"/> </xsd:complexType> </xsd:element> </xsd:schema>
将文件另存为中将 C:/MyFolder Product.xsd 目录。
打开原始 Product.xml,并将其链接到 XSD 架构,如下所示:
<?xml version="1.0"?> <Product ProductID="123" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Product.xsd"> <ProductName>Rugby jersey</ProductName> </Product>

将修改后的 XML 文档保存为 ProductWithXSD.xml。
使用 XSD 架构验证 XML 文档
修改您的应用程序,以便 XmlTextReader 加载 ProductWithXSD.xml,如下所示:
XmlTextReader r = new XmlTextReader("C://MyFolder//ProductWithXSD.xml");

ValidationType 设 架构 中,以便验证读取器执行 XSD 架构验证:
v.ValidationType = ValidationType.Schema;

生成并运行应用程序以使用 XSD 架构验证 XML 文档。
回到顶端
使用 XSD 架构中的命名空间
在 Visual Studio.net 中,打开 ProductWithXSD.xml。
声明默认命名空间 urn: MyNamespace 文档中。此外,修改 XSD 链接,以便它指定 XSD 架构来验证此命名空间中的内容:
<?xml version="1.0"?> <Product ProductID="123" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:MyNamespace" xsi:schemaLocation="urn:MyNamespace Product.xsd"> <ProductName>Rugby jersey</ProductName> </Product>

将所做的更改保存到 ProductWithXSD.xml。
打开 Product.xsd。因此,架构应用于命名空间,如下所示修改 <xsd:schema> 开始标记urn: MyNamespace:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:MyNamespace" elementFormDefault="qualified">

将所做的更改保存到 Product.xsd。
生成并运行应用程序以使用 XSD 架构验证 XML 文档。
回到顶端
缓存命名空间
在 Visual Studio.net 中,打开 Class1.cs。Main 方法的开始处创建XmlSchemaCollection 对象,如下所示:
XmlSchemaCollection cache = new XmlSchemaCollection();

XmlSchemaCollection 对象允许您在内存中缓存架构以提高性能。每个架构都与一个不同的命名空间相关联。将下面的代码添加到缓存 Product.xsd:
cache.Add("urn:MyNamespace", "C://MyFolder//Product.xsd");

将以下语句创建要添加到 XmlValidatingReader 的架构缓存,以便读者可以使用内存中架构XmlValidatingReader 对象的代码的后面添加:
v.Schemas.Add(cache);

回到顶端
验证它工作的
生成,然后运行该应用程序。
验证 XML 文档仍验证 XSD 架构。
修改 ProductWithXSD.xml 以使它无效。
验证应用程序检测到这些验证错误。

你可能感兴趣的:(xml,schema,Microsoft,validation,Class,文档)