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

文章翻译 文章翻译
文章编号: 307379 - 查看本文应用于的产品
展开全部 | 关闭全部

本文内容

概要

本文演示了如何将文档类型定义 (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 文档

  1. 启动 Visual Studio.net。
  2. 创建新的 XML 文件在本地计算机上。
  3. 对 XML 文档,以表示一种产品目录中的添加以下数据:
    <Product ProductID="123">
       <ProductName>Rugby jersey</ProductName>
    </Product>
    					
  4. 保存该文件作为 Product.xml 在新的文件夹中名为 C:\MyFolder。

使用该 DTD

创建 DTD,并链接到 XML 文档

  1. 在 Visual Studio.net 中,创建一个空文本文件。
  2. 将下面的 DTD 声明添加到该文件描述 XML 文档的语法:
    <!ELEMENT Product (ProductName)>
    <!ATTLIST Product ProductID CDATA #REQUIRED>
    <!ELEMENT ProductName (#PCDATA)>
    					
  3. 将文件另存为中将 C:\MyFolder Product.dtd 目录。
  4. 在 Visual Studio.net 中打开 Product.xml。
  5. Product.xml 要链接到 DTD 文件的 XML 文档的顶部添加下面的 DOCTYPE 语句:
    <?xml version="1.0"?>
    <!DOCTYPE Product SYSTEM "Product.dtd">
    					
  6. 将修改后的 XML 文档保存为 ProductWithDTD.xml。

使用 DTD 验证 XML 文档

  1. 在 Visual Studio.net 中,创建一个新 Visual C# 控制台应用程序项目命名 ValidateXml。
  2. 将两个 using 语句添加到 Class1.cs 的开头,如下所示:
    using System.Xml;        // for XmlTextReader and XmlValidatingReader
    using System.Xml.Schema; // for XmlSchemaCollection (which is used later)
    					
  3. Class1.cs,在声明布尔型变量,如下所示命名 isValidMain 方法的开始之前:
    private static bool isValid = true;      // If a validation error occurs,
                                             // set this flag to false in the
                                             // validation event handler. 
  4. 创建要从 Main 方法中的文本文件中读取 XML 文档的 XmlTextReader 对象,然后创建一个 XmlValidatingReader 来验证此 XML 数据,如下所示:
    XmlTextReader r = new XmlTextReader("C:\\MyFolder\\ProductWithDTD.xml");
    XmlValidatingReader v = new XmlValidatingReader(r);
    					
  5. ValidationTypeXmlValidatingReader 对象的属性指示需要 (DTDXDR架构) 的有效性规则的类型。将此属性设置为 DTD,如下所示:
    v.ValidationType = ValidationType.DTD;
    					
  6. 如果发生任何验证错误,验证读取器将生成一个验证事件。添加以下代码以注册验证事件处理程序 (MyValidationEventHandler 方法中实现第 8 步):
    v.ValidationEventHandler += 
       new ValidationEventHandler(MyValidationEventHandler);
    					
  7. 添加以下代码以读取和验证 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");
    					
  8. Main 方法之后,写入 MyValidationEventHandler 方法,如下所示:
    public static void MyValidationEventHandler(object sender, 
                                                ValidationEventArgs args) 
    {
       isValid = false;
       Console.WriteLine("Validation event\n" + args.Message);
    }
    					
  9. 生成并运行该应用程序。应用程序应报告的 XML 文档有效。
  10. 在 Visual Studio.net 中,修改 ProductWithDTD.xml 以使它无效 (例如对于删除该"<productname>橄榄球运动衫</productname>"元素)。
  11. 再次运行该应用程序。您应收到以下错误消息:
    验证事件
    元素产品具有无效的内容。应为产品名称。
    在 file:///C:/MyFolder/ProductWithDTD.xml(4, 5) 时,出现了一个错误。
    是无效的文档

使用 XDR 架构

创建 XDR 架构并链接到 XML 文档

  1. 在 Visual Studio.net 中,创建一个空文本文件。
  2. 将下面的 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>
    					
  3. 将文件另存为中将 C:\MyFolder Product.xdr 目录。
  4. 打开 Product.xml 源文件并将其链接到在 XDR 架构,如下所示:
    <?xml version="1.0"?>
    <Product ProductID="123" xmlns="x-schema:Product.xdr"> 
       <ProductName>Rugby jersey</ProductName>
    </Product>
    					
  5. 将修改后的 XML 文档保存为 ProductWithXDR.xml。

使用 XDR 架构验证 XML 文档

  1. 修改您的应用程序,以便 XmlTextReader 加载 ProductWithXDR.xml,如下所示:
    XmlTextReader r = new XmlTextReader("C:\\MyFolder\\ProductWithXDR.xml");
    					
  2. XDR 到设置 ValidationType,以便验证读取器执行 XDR 验证:
    v.ValidationType = ValidationType.XDR;
    					
  3. 生成并运行该应用程序。应用程序应报告的 XML 文档有效。
  4. 修改 ProductWithXDR.xml 以使它无效。
  5. 生成并再次运行该应用程序。您应该会收到验证错误。

使用 XSD 架构

创建 XSD 架构并链接到 XML 文档

  1. 在 Visual Studio.net 中,创建一个空文本文件。
  2. 将以下 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>
    					
  3. 将文件另存为中将 C:\MyFolder Product.xsd 目录。
  4. 打开原始 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>
    					
  5. 将修改后的 XML 文档保存为 ProductWithXSD.xml。

使用 XSD 架构验证 XML 文档

  1. 修改您的应用程序,以便 XmlTextReader 加载 ProductWithXSD.xml,如下所示:
    XmlTextReader r = new XmlTextReader("C:\\MyFolder\\ProductWithXSD.xml");
    					
  2. ValidationType架构 中,以便验证读取器执行 XSD 架构验证:
    v.ValidationType = ValidationType.Schema;
    					
  3. 生成并运行应用程序以使用 XSD 架构验证 XML 文档。

使用 XSD 架构中的命名空间

  1. 在 Visual Studio.net 中,打开 ProductWithXSD.xml。
  2. 声明默认命名空间 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>
    					
  3. 将所做的更改保存到 ProductWithXSD.xml。
  4. 打开 Product.xsd。因此,架构应用于命名空间,如下所示修改 <xsd:schema> 开始标记urn: MyNamespace
    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                targetNamespace="urn:MyNamespace"
                elementFormDefault="qualified">
    					
  5. 将所做的更改保存到 Product.xsd。
  6. 生成并运行应用程序以使用 XSD 架构验证 XML 文档。

缓存命名空间

  1. 在 Visual Studio.net 中,打开 Class1.cs。Main 方法的开始处创建 XmlSchemaCollection 对象,如下所示:
    XmlSchemaCollection cache = new XmlSchemaCollection();
    					
  2. XmlSchemaCollection 对象允许您在内存中缓存架构以提高性能。每个架构都与一个不同的命名空间相关联。将下面的代码添加到缓存 Product.xsd:
    cache.Add("urn:MyNamespace", "C:\\MyFolder\\Product.xsd");
    					
  3. 将以下语句创建要添加到 XmlValidatingReader 的架构缓存,以便读者可以使用内存中架构 XmlValidatingReader 对象的代码的后面添加:
    v.Schemas.Add(cache);
    					

验证它工作的

  1. 生成,然后运行该应用程序。
  2. 验证 XML 文档仍验证 XSD 架构。
  3. 修改 ProductWithXSD.xml 以使它无效。
  4. 验证应用程序检测到这些验证错误。

属性

文章编号: 307379 - 最后修改: 2005年12月5日 - 修订: 3.3
这篇文章中的信息适用于:
  • Microsoft Visual C# .NET 2003 标准版
  • Microsoft Visual C# .NET 2002 标准版
  • Microsoft .NET Framework 1.1
  • Microsoft .NET Framework 1.0
关键字:?
kbmt kbhowtomaster KB307379 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 307379
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com