Проверка XML-документа с помощью DTD, XDR или XSD в Visual Basic

В этой статье показано, как использовать XmlValidatingReader класс для проверки XML-документа на соответствие DTD, XDR или XSD-схеме в Visual Basic 2005 или Visual Basic .NET. Также описывается оптимизация проверки путем кэширования схем.

Исходная версия продукта: Visual Basic
Исходный номер базы знаний: 315533

Сводка

Документы XML содержат элементы и атрибуты и предоставляют гибкий и эффективный способ обмена данными между приложениями и организациями. Чтобы указать допустимую структуру и содержимое XML-документа, можно написать схему определения типа документа (DTD), схему Microsoft XML-Data Сокращено (XDR) или XSD языка определения xml-схем (XSD).

Схемы XSD являются предпочтительным способом указания грамматики XML в платформа .NET Framework, но также поддерживаются DTD и схемы XDR.

В этой статье вы узнаете, как применить DTD, XDR или XSD-схему к XML-документу в Microsoft Visual Basic 2005 или в Microsoft Visual Basic .NET. Затем вы узнаете, как использовать класс XmlValidatingReader для проверки XML-документа на соответствие указанной грамматике. Вы также узнаете, как использовать класс XmlSchemaCollection для кэширования схем в памяти для оптимизации проверки XML.

Требования

В следующем списке перечислены рекомендуемые оборудование, программное обеспечение, сетевая инфраструктура и пакеты обновления: Microsoft Visual Basic 2005 или Microsoft Visual Basic .NET

В этой статье рассматриваются следующие пространства имен библиотеки классов Microsoft платформа .NET Framework:

  • System.Xml
  • System.Xml.Schema

В этой статье предполагается, что вы знакомы со следующими разделами:

  • Синтаксис Visual Basic 2005 или Visual Basic .NET
  • Основные понятия XML, включая проблемы с проверкой

Создание XML-документа

  1. Запустите Microsoft Visual Studio 2005 или Microsoft Visual Studio .NET. Затем создайте НОВЫЙ XML-файл (в меню Файл наведите указатель мыши на пункт Создать и выберите пункт Файл).

  2. Выберите тип XML-файла и нажмите кнопку Открыть.

  3. Добавьте следующие данные в XML-документ, чтобы представить продукт в каталоге:

    <Product ProductID="123">
        <ProductName>Rugby jersey</ProductName>
    </Product>
    
  4. Сохраните файл как Product.xml в папку, к которому вы сможете легко получить доступ позже (в примерах кода в этой статье предполагается папка с именем C:\MyFolder).

  1. В Visual Studio 2005 или Visual Studio .NET наведите указатель мыши на пункт Создать в меню Файл и выберите пункт Файл.

  2. Выберите тип текстового файла и нажмите кнопку Открыть.

  3. Добавьте в файл следующие объявления DTD, чтобы описать грамматику XML-документа:

    <!ELEMENT Product (ProductName)>
    <!ATTLIST Product ProductID CDATA #REQUIRED>
    <!ELEMENT ProductName (#PCDATA)>
    
  4. Сохраните файл как Product.dtd в той же папке, что и XML-документ.

  5. Повторное открытиеProduct.xml в Visual Studio 2005 или Visual Studio .NET; Для этого наведите указатель мыши на пункт Открыть в меню Файл, а затем выберите пункт Файл. Добавьте инструкцию DOCTYPE (под строкой ?xml version="1.0" ), как показано ниже. Это связывает XML-документ с DTD-файлом).

    <?xml version="1.0" encoding="utf-8" ?>
    <!DOCTYPE Product SYSTEM "Product.dtd">
    
  6. Сохраните измененный XML-документ какProductWithDTD.xml.

Выполнение проверки с помощью DTD

  1. В Visual Studio 2005 или Visual Studio .NET создайте проект консольного приложения Visual Basic с именем ValidateXmlUsingVB.

  2. Visual Studio 2005 или Visual Studio .NET отображает новый файл с именем Module1.vb. В начале этого файла добавьте два оператора Imports следующим образом:

    Imports System.Xml ' For XmlTextReader and XmlValidatingReader
    Imports System.Xml.Schema ' For XmlSchemaCollection (used later)
    
  3. В Module1 (перед началом подпрограммы Main) объявите логическую переменную isValid следующим образом:

    'If a validation error occurs,
    ' you will set this flag to False 
    ' in the validation event handler. 
    Private isValid As Boolean = True
    
  4. В подпрограмме Main создайте объект XmlTextReader для чтения XML-документа из текстового файла. Затем создайте XmlValidatingReader объект для проверки этих XML-данных:

    Dim r As New XmlTextReader("C:\MyFolder\ProductWithDTD.xml")
    Dim v As New XmlValidatingReader(r)
    
  5. Объект XmlValidatingReader имеет свойство ValidationType, указывающее тип требуемой проверки (DTD, XDR или Schema). Задайте для этого свойства значение DTD следующим образом:

    v.ValidationType = ValidationType.DTD
    
  6. При возникновении каких-либо ошибок проверки средство чтения создает событие проверки. Добавьте следующий код для регистрации обработчика событий проверки (вы реализуете подпрограмму MyValidationEventHandler на шаге 8 этого раздела):

    AddHandler v.ValidationEventHandler, AddressOf MyValidationEventHandler
    
  7. Добавьте следующий код для чтения и проверки XML-документа. Если возникают какие-либо ошибки проверки, для обработки ошибки будет вызван MyValidationEventHandler. Для этой подпрограммы будет задано значение isValidFalse (см. шаг 8 этого раздела). Вы можете проверка состояние isValid после проверки, чтобы узнать, является ли документ допустимым или недопустимым.

    While v.Read()' Could add code here to process the content.
    End While
    v.Close()' Check whether the document is valid or invalid.
    If isValid Then
        Console.WriteLine("Document is valid")
    Else
        Console.WriteLine("Document is invalid")
    End If
    
  8. После подпрограммы Main напишите подпрограмму MyValidationEventHandler следующим образом:

    Public Sub MyValidationEventHandler(ByVal sender As Object, _
     ByVal args As ValidationEventArgs)
         isValid = False
         Console.WriteLine("Validation event" & vbCrLf & args.Message)
    End Sub
    
  9. Выполните сборку и запуск приложения.

Приложение должно сообщить о допустимости XML-документа. 10. В Visual Studio 2005 или Visual Studio .NET измените ProductWithDTD.xml, чтобы сделать его недопустимым (например, удалите элемент ProductName Rugby jersey/ ProductName ). 11. Снова запустите приложение.

Приложение должно отобразить следующее сообщение об ошибке:

Элемент события проверки "Product" имеет неполное содержимое. Ожидается "ProductName". Произошла ошибка в file:///C:/MyFolder/ProductWithDTD.xml(4, 3). Недопустимый документ

  1. В Visual Studio 2005 или Visual Studio .NET наведите указатель мыши на пункт Создать в меню Файл и выберите пункт Файл.

  2. Выберите тип текстового файла и нажмите кнопку Открыть.

  3. Добавьте в файл следующие определения схемы XDR, чтобы описать грамматику XML-документа:

    <?xml version="1.0"?>
    <Schema name="ProductSchema" 
     xmlns="urn:schemas-microsoft-com:xml-data"
     xmlns:dt="urn:schemas-microsoft-com:datatypes">
    
        <AttributeType name="ProductID" dt:type="int"/>
        <ElementType name="ProductName" dt:type="string"/>
    
        <ElementType name="Product" content="eltOnly">
            <attribute type="ProductID" required="yes"/>
            <element type="ProductName"/>
        </ElementType>
    </Schema>
    
  4. Сохраните файл как Product.xdr в той же папке, что и XML-документ.

  5. Повторно откройте исходный Product.xml, а затем свяжите его со схемой XDR следующим образом:

    <?xml version="1.0" encoding="utf-8" ?>
    <Product ProductID="123" xmlns="x-schema:Product.xdr"> 
        <ProductName>Rugby jersey</ProductName>
    </Product>
    
  6. Сохраните измененный XML-документ какProductWithXDR.xml.

Выполнение проверки с помощью схемы XDR

  1. Измените приложение так, чтобы XmlTextReader загружал ProductWithXDR.xmlследующим образом:

    Dim r As New XmlTextReader("C:\MyFolder\ProductWithXDR.xml")
    
  2. Задайте значение ValidationType XDR, чтобы проверяющее средство чтения выполняло проверку XDR, как показано ниже.

    v.ValidationType = ValidationType.XDR
    
  3. Выполните сборку и запуск приложения.

    Приложение должно сообщить о допустимости XML-документа.

  4. ИзменитеProductWithXDR.xml, чтобы сделать его заведомо недействительным.

  5. Запустите приложение еще раз.

    Приложение должно сообщить об ошибке проверки.

  1. В Visual Studio .NET наведите указатель мыши на пункт Создать в меню Файл и выберите пункт Файл.

  2. Выберите тип текстового файла и нажмите кнопку Открыть.

  3. Добавьте в файл следующее определение схемы 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>
    
  4. Сохраните файл как Product.xsd в той же папке, что и XML-документ.

  5. Повторно откройте исходный Product.xml, а затем свяжите его со схемой XSD следующим образом:

    <?xml version="1.0" encoding="utf-8" ?>
    <Product ProductID="123" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:noNamespaceSchemaLocation="Product.xsd">
        <ProductName>Rugby jersey</ProductName>
    </Product>
    
  6. Сохраните измененный XML-документ какProductWithXSD.xml.

Выполнение проверки с использованием схемы XSD

  1. Измените приложение так, чтобы XmlTextReader загрузка ProductWithXSD.xml, как показано ниже.

    Dim r As New XmlTextReader("C:\MyFolder\ProductWithXSD.xml")
    
  2. Присвойте ValidationType параметру значение Схема, чтобы проверяющее средство чтения выполняло проверку схемы XSD, как показано ниже.

    v.ValidationType = ValidationType.Schema
    
  3. Создайте и запустите приложение для проверки XML-документа с помощью схемы XSD.

    Приложение должно сообщить о допустимости XML-документа.

Использование пространств имен в схеме XSD

  1. В Visual Studio 2005 или Visual Studio .NET откройте ProductWithXSD.xml. Объявите пространство urn:MyNamespaceимен по умолчанию , в документе. Измените компоновку XSD, чтобы указать схему XSD для проверки содержимого в этом пространстве имен, как показано ниже.

    <?xml version="1.0" encoding="utf-8"?>
    <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>
    
  2. СохранитеProductWithXSD.xml.

  3. Откройте Product.xsd, перейдите на вкладку XML и измените начальный тег xsd:schema следующим образом, чтобы схема применялась к пространству urn:MyNamespaceимен :

    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
     targetNamespace="urn:MyNamespace"
     elementFormDefault="qualified">
    
  4. Сохраните Product.xsd.

  5. Запустите приложение для проверки XML-документа с помощью схемы XSD.

Пространства имен кэша

  1. В Visual Studio 2005 или Visual Studio .NET откройте Module1.vb. В начале подпрограммы Main создайте XmlSchemaCollection объект следующим образом:

    Dim cache As 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. Убедитесь, что приложение обнаруживает эти ошибки проверки.