Поделиться через


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

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

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

Итоги

Расширяемые документы языка разметки (XML) содержат элементы и атрибуты, а также обеспечивают гибкий и эффективный способ обмена данными между приложениями и организациями. Чтобы указать допустимую структуру и содержимое XML-документа, можно написать определение типа документа (DTD), схему сокращенных xml-данных (XDR) или схему языка определения 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. В начале этого файла добавьте две инструкции Import, как показано ниже.

    Imports System.Xml ' For XmlTextReader and XmlValidatingReader
    Imports System.Xml.Schema ' For XmlSchemaCollection (used later)
    
  3. В Module1 (перед началом основной подпрограммы) объявите логическую переменную с именем 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. Если возникают ошибки проверки, средство проверки создает событие проверки. Добавьте следующий код для регистрации обработчика событий проверки (в шаге 8 этого раздела реализуется подзапуск MyValidationEventHandler):

    AddHandler v.ValidationEventHandler, AddressOf MyValidationEventHandler
    
  7. Добавьте следующий код для чтения и проверки XML-документа. При возникновении ошибок проверки вызывается MyValidationEventHandler для обработки ошибки. В этом подразделе задано isValid значение False (см. шаг 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. После основной подпрограммы напишите подзапуск 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 джерси или 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 Schema, чтобы проверяющий модуль чтения выполнял проверку схемы 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. Убедитесь, что приложение обнаруживает эти ошибки проверки.