Прочитать на английском

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


Extensions.Validate Метод

Определение

Проверяет соответствие XDocument, XElement или XAttribute спецификации XSD в XmlSchemaSet.

Перегрузки

Validate(XDocument, XmlSchemaSet, ValidationEventHandler)

Этот метод проверяет соответствие XDocument спецификации XSD в XmlSchemaSet.

Validate(XAttribute, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler)

Этот метод проверяет XAttribute на соответствие указанным XmlSchemaObject и XmlSchemaSet.

Validate(XDocument, XmlSchemaSet, ValidationEventHandler, Boolean)

Проверяет XDocument на соответствие XSD в XmlSchemaSet с возможностью заполнения дерева XML набором сведений после проверки схемы (PSVI).

Validate(XElement, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler)

Этот метод проверяет поддерево XElement на соответствие указанным XmlSchemaObject и XmlSchemaSet.

Validate(XAttribute, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler, Boolean)

Проверяет XAttribute на соответствие указанным XmlSchemaObject и XmlSchemaSet, с возможностью заполнения дерева XML набором сведений после проверки схемы (PSVI).

Validate(XElement, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler, Boolean)

Проверяет поддерево XElement на соответствие указанным XmlSchemaObject и XmlSchemaSet, с возможностью заполнения дерева XML набором сведений после проверки схемы (PSVI).

Комментарии

Эти методы используют базовый XmlReader для проверки XML-дерева на соответствие XSD.

Сообщения об ошибках проверки и предупреждения обрабатываются с помощью делегата ValidationEventHandler . Если для этих методов не предоставлен обработчик событий, ошибки проверки предоставляются в виде XmlSchemaValidationException. Предупреждения проверки не вызывают XmlSchemaValidationException исключение .

Некоторые из этих методов расширения при необходимости разрешают заполнение информационного набора после проверки схемы (PSVI).

Validate(XDocument, XmlSchemaSet, ValidationEventHandler)

Исходный код:
XNodeValidator.cs
Исходный код:
XNodeValidator.cs
Исходный код:
XNodeValidator.cs

Этот метод проверяет соответствие XDocument спецификации XSD в XmlSchemaSet.

C#
public static void Validate (this System.Xml.Linq.XDocument source, System.Xml.Schema.XmlSchemaSet schemas, System.Xml.Schema.ValidationEventHandler? validationEventHandler);
C#
public static void Validate (this System.Xml.Linq.XDocument source, System.Xml.Schema.XmlSchemaSet schemas, System.Xml.Schema.ValidationEventHandler validationEventHandler);

Параметры

source
XDocument

Объект XDocument для проверки.

schemas
XmlSchemaSet

XmlSchemaSet для проверки на соответствие.

validationEventHandler
ValidationEventHandler

ValidationEventHandler для события, которое происходит, когда читатель встречает ошибки проверки. При значении null генерируется исключение возникновения ошибок проверки.

Исключения

Генерируется для ошибок проверки XSD.

Примеры

В следующем примере создается набор схем XmlSchemaSet, затем с его помощью проводится проверка правильности двух объектов XDocument. Правильность одного документа подтверждается, а второго - нет.

C#
                string xsdMarkup =  
    @"<xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'>  
       <xsd:element name='Root'>  
        <xsd:complexType>  
         <xsd:sequence>  
          <xsd:element name='Child1' minOccurs='1' maxOccurs='1'/>  
          <xsd:element name='Child2' minOccurs='1' maxOccurs='1'/>  
         </xsd:sequence>  
        </xsd:complexType>  
       </xsd:element>  
      </xsd:schema>";  
XmlSchemaSet schemas = new XmlSchemaSet();  
schemas.Add("", XmlReader.Create(new StringReader(xsdMarkup)));  

XDocument doc1 = new XDocument(  
    new XElement("Root",  
        new XElement("Child1", "content1"),  
        new XElement("Child2", "content1")  
    )  
);  

XDocument doc2 = new XDocument(  
    new XElement("Root",  
        new XElement("Child1", "content1"),  
        new XElement("Child3", "content1")  
    )  
);  

Console.WriteLine("Validating doc1");  
bool errors = false;  
doc1.Validate(schemas, (o, e) =>  
                     {  
                         Console.WriteLine("{0}", e.Message);  
                         errors = true;  
                     });  
Console.WriteLine("doc1 {0}", errors ? "did not validate" : "validated");  

Console.WriteLine();  
Console.WriteLine("Validating doc2");  
errors = false;  
doc2.Validate(schemas, (o, e) =>  
                     {  
                         Console.WriteLine("{0}", e.Message);  
                         errors = true;  
                     });  
Console.WriteLine("doc2 {0}", errors ? "did not validate" : "validated");  

В этом примере выводятся следующие данные:

Validating doc1  
doc1 validated  

Validating doc2  
The element 'Root' has invalid child element 'Child3'. List of possible elements expected: 'Child2'.  
doc2 did not validate  

Комментарии

Этот метод расширения проверяет, соответствует ли XDocument объект модели содержимого схемы в XmlSchemaSet.

Применяется к

.NET 9 и другие версии
Продукт Версии
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

Validate(XAttribute, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler)

Исходный код:
XNodeValidator.cs
Исходный код:
XNodeValidator.cs
Исходный код:
XNodeValidator.cs

Этот метод проверяет XAttribute на соответствие указанным XmlSchemaObject и XmlSchemaSet.

C#
public static void Validate (this System.Xml.Linq.XAttribute source, System.Xml.Schema.XmlSchemaObject partialValidationType, System.Xml.Schema.XmlSchemaSet schemas, System.Xml.Schema.ValidationEventHandler? validationEventHandler);
C#
public static void Validate (this System.Xml.Linq.XAttribute source, System.Xml.Schema.XmlSchemaObject partialValidationType, System.Xml.Schema.XmlSchemaSet schemas, System.Xml.Schema.ValidationEventHandler validationEventHandler);

Параметры

source
XAttribute

Объект XAttribute для проверки.

partialValidationType
XmlSchemaObject

XmlSchemaObject, задающий проверяемое поддерево.

schemas
XmlSchemaSet

XmlSchemaSet для проверки на соответствие.

validationEventHandler
ValidationEventHandler

ValidationEventHandler для события, которое происходит, когда читатель встречает ошибки проверки. При значении null генерируется исключение возникновения ошибок проверки.

Исключения

Генерируется для ошибок проверки XSD.

Примеры

C#
                string xsdMarkup =  
    @"<xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'>  
       <xsd:element name='Root'>  
        <xsd:complexType>  
         <xsd:simpleContent>  
          <xsd:extension base='xsd:string'>  
           <xsd:attribute name='Lang' use='required'>  
            <xsd:simpleType>  
             <xsd:restriction base='xsd:token'>  
              <xsd:enumeration value='C#'/>  
              <xsd:enumeration value='VB'/>  
             </xsd:restriction>  
            </xsd:simpleType>  
           </xsd:attribute>  
          </xsd:extension>  
         </xsd:simpleContent>  
        </xsd:complexType>  
       </xsd:element>  
      </xsd:schema>";  

XmlSchemaSet schemas = new XmlSchemaSet();  
schemas.Add("", XmlReader.Create(new StringReader(xsdMarkup)));  

XDocument doc1 = new XDocument(  
    new XElement("Root",  
        new XAttribute("Lang", "C#")  
    )  
);  

Console.WriteLine("Validating doc1 ...");  
bool errors = false;  
doc1.Validate(schemas, (sender, e) =>  
    {  
        Console.WriteLine(e.Message);  
        errors = true;  
    }, true);  
Console.WriteLine("doc1 {0}", errors ? "did not validate" : "validated");  

Console.WriteLine();  
Console.WriteLine("Validating Lang attribute ...");  
XAttribute lang = doc1.Root.Attribute("Lang");  

errors = false;  
lang.Validate(lang.GetSchemaInfo().SchemaAttribute, schemas, (sender, e) =>  
    {  
        Console.WriteLine(e.Message);  
        errors = true;  
    });  
Console.WriteLine("lang {0}", errors ? "did not validate" : "validated");  

// the following makes the Lang attribute invalid according to the schema  
lang.Value = "VC";  

Console.WriteLine();  
Console.WriteLine("Validating Lang attribute ...");  

errors = false;  
lang.Validate(lang.GetSchemaInfo().SchemaAttribute, schemas, (sender, e) =>  
    {  
        Console.WriteLine(e.Message);  
        errors = true;  
    });  
Console.WriteLine("lang {0}", errors ? "did not validate" : "validated");  

В этом примере выводятся следующие данные:

Validating doc1 ...  
doc1 validated  

Validating Lang attribute ...  
lang validated  

Validating Lang attribute ...  
The 'Lang' attribute is invalid - The value 'VC' is invalid according to its datatype 'Token' - The Enumeration constraint failed.  
lang did not validate  

Комментарии

Этот метод можно использовать для проверки XAttribute соответствия объекта схеме. Обычно этот метод используется при изменении атрибута и требуется убедиться, что он по-прежнему соответствует его схеме. Вы можете проверить весь документ, но для проверки только атрибута требуется меньше времени на обработку.

При передаче null для validationEventHandlerэтот метод создает исключение при ошибках проверки. Предупреждения проверки не будут вызывать исключение.

Для проверки атрибута используется экземпляр XmlSchemaObject. Этот экземпляр можно получить различными способами. Простой способ заключается в следующем:

  1. Проверка соответствия документа схеме.

  2. Добавьте набор сведений после проверки схемы (PSVI), вызвав Validate метод расширения.

  3. GetSchemaInfo Вызовите метод расширения, чтобы получить объект, реализующий IXmlSchemaInfo. Из полученного объекта можно получить .XmlSchemaObject

После создания экземпляра XmlSchemaObjectможно использовать этот метод для проверки атрибута.

Применяется к

.NET 9 и другие версии
Продукт Версии
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

Validate(XDocument, XmlSchemaSet, ValidationEventHandler, Boolean)

Исходный код:
XNodeValidator.cs
Исходный код:
XNodeValidator.cs
Исходный код:
XNodeValidator.cs

Проверяет XDocument на соответствие XSD в XmlSchemaSet с возможностью заполнения дерева XML набором сведений после проверки схемы (PSVI).

C#
public static void Validate (this System.Xml.Linq.XDocument source, System.Xml.Schema.XmlSchemaSet schemas, System.Xml.Schema.ValidationEventHandler? validationEventHandler, bool addSchemaInfo);
C#
public static void Validate (this System.Xml.Linq.XDocument source, System.Xml.Schema.XmlSchemaSet schemas, System.Xml.Schema.ValidationEventHandler validationEventHandler, bool addSchemaInfo);

Параметры

source
XDocument

Объект XDocument для проверки.

schemas
XmlSchemaSet

XmlSchemaSet для проверки на соответствие.

validationEventHandler
ValidationEventHandler

ValidationEventHandler для события, которое происходит, когда читатель встречает ошибки проверки. При значении null генерируется исключение возникновения ошибок проверки.

addSchemaInfo
Boolean

Boolean, указывающий, требуется ли заполнение набором сведений после проверки схемы (PSVI).

Исключения

Генерируется для ошибок проверки XSD.

Примеры

В следующем примере содержится XSD, который определяет Child2 элемент с атрибутом Att1 со значением по умолчанию. После успешной проверки документа в XML-дерево добавляется атрибут со значением по умолчанию. Обратите внимание, что атрибут по умолчанию не добавляется в doc2, который не проверяет соответствие схеме.

C#
                string xsdMarkup =  
    @"<xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'>  
       <xsd:element name='Root'>  
        <xsd:complexType>  
         <xsd:sequence>  
          <xsd:element name='Child1' minOccurs='1' maxOccurs='1'/>  
          <xsd:element name='Child2' minOccurs='1' maxOccurs='1'>  
           <xsd:complexType>  
            <xsd:simpleContent>  
             <xsd:extension base='xsd:string'>  
              <xsd:attribute name='Att1' default='Att1 Default Value'/>  
             </xsd:extension>  
            </xsd:simpleContent>  
           </xsd:complexType>  
          </xsd:element>  
         </xsd:sequence>  
        </xsd:complexType>  
       </xsd:element>  
      </xsd:schema>";  
XmlSchemaSet schemas = new XmlSchemaSet();  
schemas.Add("", XmlReader.Create(new StringReader(xsdMarkup)));  

XDocument doc1 = new XDocument(  
    new XElement("Root",  
        new XElement("Child1", "c1"),  
        new XElement("Child2", "c2")  
    )  
);  

XDocument doc2 = new XDocument(  
    new XElement("Root",  
        new XElement("Child1", "content1"),  
        new XElement("Child3", "content1")  
    )  
);  

Console.WriteLine("Validating doc1");  
bool errors = false;  
doc1.Validate(schemas, (o, e) =>  
                           {  
                               Console.WriteLine("{0}", e.Message);  
                               errors = true;  
                           }, true);  
Console.WriteLine("doc1 {0}", errors ? "did not validate" : "validated");  

Console.WriteLine();  
Console.WriteLine("Validating doc2");  
errors = false;  
doc2.Validate(schemas, (o, e) =>  
                     {  
                         Console.WriteLine("{0}", e.Message);  
                         errors = true;  
                     }, true);  
Console.WriteLine("doc2 {0}", errors ? "did not validate" : "validated");  

Console.WriteLine();  
Console.WriteLine("Contents of doc1:");  
Console.WriteLine(doc1);  

Console.WriteLine();  
Console.WriteLine("Contents of doc2:");  
Console.WriteLine(doc2);  

В этом примере выводятся следующие данные:

Validating doc1  
doc1 validated  

Validating doc2  
The element 'Root' has invalid child element 'Child3'. List of possible elements expected: 'Child2'.  
doc2 did not validate  

Contents of doc1:  
<Root>  
  <Child1>c1</Child1>  
  <Child2 Att1="Att1 Default Value">c2</Child2>  
</Root>  

Contents of doc2:  
<Root>  
  <Child1>content1</Child1>  
  <Child3>content1</Child3>  
</Root>  

В следующем примере дерево заполняется PSVI. После проверки он выводит все элементы и атрибуты в дереве, которые являются недопустимыми в соответствии с PSVI.

C#
                static void DumpInvalidNodes(XElement el)  
{  
    if (el.GetSchemaInfo().Validity != XmlSchemaValidity.Valid)  
        Console.WriteLine("Invalid Element {0}",  
            el.AncestorsAndSelf()  
            .InDocumentOrder()  
            .Aggregate("", (s, i) => s + "/" + i.Name.ToString()));  
    foreach (XAttribute att in el.Attributes())  
        if (att.GetSchemaInfo().Validity != XmlSchemaValidity.Valid)  
            Console.WriteLine("Invalid Attribute {0}",  
                att  
                .Parent  
                .AncestorsAndSelf()  
                .InDocumentOrder()  
                .Aggregate("",  
                    (s, i) => s + "/" + i.Name.ToString()) + "/@" + att.Name.ToString()  
                );  
    foreach (XElement child in el.Elements())  
        DumpInvalidNodes(child);  
}  

static void Main(string[] args)  
{  
   string xsdMarkup =  
        @"<xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'>  
           <xsd:simpleType name='GCType'>  
            <xsd:restriction base='xsd:token'>  
             <xsd:enumeration value='AAA'/>  
             <xsd:enumeration value='BBB'/>  
            </xsd:restriction>  
           </xsd:simpleType>  
           <xsd:element name='Root'>  
            <xsd:complexType>  
             <xsd:sequence>  
              <xsd:element name='Child1' minOccurs='1' maxOccurs='1'>  
               <xsd:complexType>  
                <xsd:sequence>  
                 <xsd:element name='GrandChild1' type='GCType'/>  
                 <xsd:element name='GrandChild2' type='GCType'/>  
                 <xsd:element name='GrandChild3' type='GCType'/>  
                </xsd:sequence>  
               </xsd:complexType>  
              </xsd:element>  
             </xsd:sequence>  
            </xsd:complexType>  
           </xsd:element>  
          </xsd:schema>";  

    XmlSchemaSet schemas = new XmlSchemaSet();  
    schemas.Add("", XmlReader.Create(new StringReader(xsdMarkup)));  

    XDocument doc1 = new XDocument(  
        new XElement("Root",  
            new XElement("Child1",  
                new XElement("GrandChild1", "AAA"),  
                new XElement("GrandChild2", "ZZZ"),  
                new XElement("GrandChild3", "ZZZ")  
            )  
        )  
    );  

    Console.WriteLine("Validating doc1 ...");  
    bool errors = false;  
    doc1.Validate(schemas, (sender, e) =>  
        {  
            Console.WriteLine(e.Message);  
            errors = true;  
        }, true);  
    Console.WriteLine("doc1 {0}", errors ? "did not validate" : "validated");  
    DumpInvalidNodes(doc1.Root);  
}  

В этом примере выводятся следующие данные:

Validating doc1 ...  
The 'GrandChild2' element is invalid - The value 'ZZZ' is invalid according to its datatype 'GCType' - The Enumeration constraint failed.  
The 'GrandChild3' element is invalid - The value 'ZZZ' is invalid according to its datatype 'GCType' - The Enumeration constraint failed.  
doc1 did not validate  
Invalid Element /Root  
Invalid Element /Root/Child1  
Invalid Element /Root/Child1/GrandChild2  
Invalid Element /Root/Child1/GrandChild3  

Комментарии

Этот метод расширения проверяет, соответствует ли XDocument объект модели содержимого схемы в XmlSchemaSet.

Если addSchemaInfo имеет значение true, этот метод заполняет дерево XML набором сведений после проверки схемы (PSVI).

Чтобы заполнить ДЕРЕВО XML с помощью PSVI, необходимо выполнить два шага.

  1. Во-первых, заметка добавляется ко всем узлам в дереве, чтобы можно было вызывать Extensions.GetSchemaInfo или Extensions.GetSchemaInfo для элемента или атрибута в дереве.

  2. Во-вторых, элементы и атрибуты по умолчанию, определенные в XSD, добавляются в XML-дерево. Вызвав один из GetSchemaInfo методов, можно определить, был ли добавлен определенный элемент или атрибут из XSD в качестве элемента или атрибута по умолчанию.

Применяется к

.NET 9 и другие версии
Продукт Версии
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

Validate(XElement, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler)

Исходный код:
XNodeValidator.cs
Исходный код:
XNodeValidator.cs
Исходный код:
XNodeValidator.cs

Этот метод проверяет поддерево XElement на соответствие указанным XmlSchemaObject и XmlSchemaSet.

C#
public static void Validate (this System.Xml.Linq.XElement source, System.Xml.Schema.XmlSchemaObject partialValidationType, System.Xml.Schema.XmlSchemaSet schemas, System.Xml.Schema.ValidationEventHandler? validationEventHandler);
C#
public static void Validate (this System.Xml.Linq.XElement source, System.Xml.Schema.XmlSchemaObject partialValidationType, System.Xml.Schema.XmlSchemaSet schemas, System.Xml.Schema.ValidationEventHandler validationEventHandler);

Параметры

source
XElement

Объект XElement для проверки.

partialValidationType
XmlSchemaObject

XmlSchemaObject, задающий проверяемое поддерево.

schemas
XmlSchemaSet

XmlSchemaSet для проверки на соответствие.

validationEventHandler
ValidationEventHandler

ValidationEventHandler для события, которое происходит, когда читатель встречает ошибки проверки. При значении null генерируется исключение возникновения ошибок проверки.

Исключения

Генерируется для ошибок проверки XSD.

Примеры

C#
                string xsdMarkup =  
    @"<xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'>  
       <xsd:element name='Root'>  
        <xsd:complexType>  
         <xsd:sequence>  
          <xsd:element name='Child1' minOccurs='1' maxOccurs='1'>  
           <xsd:complexType>  
            <xsd:sequence>  
             <xsd:element name='GrandChild1' minOccurs='1' maxOccurs='1'/>  
             <xsd:element name='GrandChild2' minOccurs='1' maxOccurs='2'/>  
            </xsd:sequence>  
           </xsd:complexType>  
          </xsd:element>  
         </xsd:sequence>  
        </xsd:complexType>  
       </xsd:element>  
      </xsd:schema>";  

XmlSchemaSet schemas = new XmlSchemaSet();  
schemas.Add("", XmlReader.Create(new StringReader(xsdMarkup)));  

XDocument doc1 = new XDocument(  
    new XElement("Root",  
        new XElement("Child1",  
            new XElement("GrandChild1", "gc"),  
            new XElement("GrandChild2", "gc")  
        )  
    )  
);  

Console.WriteLine("Validating doc1 ...");  
bool errors = false;  
doc1.Validate(schemas, (sender, e) =>  
    {  
        Console.WriteLine(e.Message);  
        errors = true;  
    }, true);  
Console.WriteLine("doc1 {0}", errors ? "did not validate" : "validated");  

Console.WriteLine();  
Console.WriteLine("Validating Child1 after first edit ...");  
XElement child1 = doc1.Element("Root").Element("Child1");  
child1.Add(new XElement("GrandChild2", "gc"));  
errors = false;  
child1.Validate(child1.GetSchemaInfo().SchemaElement, schemas, (sender, e) =>  
    {  
        Console.WriteLine(e.Message);  
        errors = true;  
    });  
Console.WriteLine("child1 {0}", errors ? "did not validate" : "validated");  

// the following makes the Child1 element invalid according to the schema  
child1.Add(new XElement("GrandChild3", "gc"));  
Console.WriteLine();  
Console.WriteLine("Validating Child1 after second edit ...");  
child1.Validate(child1.GetSchemaInfo().SchemaElement, schemas, (sender, e) =>  
    {  
        Console.WriteLine(e.Message);  
        errors = true;  
    });  
Console.WriteLine("child1 {0}", errors ? "did not validate" : "validated");  

В этом примере выводятся следующие данные:

Validating doc1 ...  
doc1 validated  

Validating Child1 after first edit ...  
child1 validated  

Validating Child1 after second edit ...  
The element 'Child1' has invalid child element 'GrandChild3'.  
child1 did not validate  

Комментарии

Этот метод можно использовать для проверки соответствия вложенного дерева (с корнем XElement ) схеме. Обычно этот метод используется при изменении вложенного дерева и требуется убедиться, что оно по-прежнему соответствует его схеме. Вы можете проверить весь документ, но для проверки только вложенного дерева требуется меньше времени.

Если передать null для validationEventHandler, этот метод создает исключение при ошибках проверки. Предупреждения проверки не будут вызывать исключение.

Для проверки вложенного дерева используется экземпляр XmlSchemaObject. Этот экземпляр можно получить различными способами. Простой способ заключается в следующем:

  1. Проверка соответствия документа схеме.

  2. Добавьте набор сведений после проверки схемы (PSVI), вызвав Validate метод расширения.

  3. GetSchemaInfo Вызовите метод расширения, чтобы получить объект, реализующий IXmlSchemaInfo. Из полученного объекта можно получить .XmlSchemaObject

После создания экземпляра XmlSchemaObjectможно использовать этот метод для проверки вложенного дерева.

Применяется к

.NET 9 и другие версии
Продукт Версии
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

Validate(XAttribute, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler, Boolean)

Исходный код:
XNodeValidator.cs
Исходный код:
XNodeValidator.cs
Исходный код:
XNodeValidator.cs

Проверяет XAttribute на соответствие указанным XmlSchemaObject и XmlSchemaSet, с возможностью заполнения дерева XML набором сведений после проверки схемы (PSVI).

C#
public static void Validate (this System.Xml.Linq.XAttribute source, System.Xml.Schema.XmlSchemaObject partialValidationType, System.Xml.Schema.XmlSchemaSet schemas, System.Xml.Schema.ValidationEventHandler? validationEventHandler, bool addSchemaInfo);
C#
public static void Validate (this System.Xml.Linq.XAttribute source, System.Xml.Schema.XmlSchemaObject partialValidationType, System.Xml.Schema.XmlSchemaSet schemas, System.Xml.Schema.ValidationEventHandler validationEventHandler, bool addSchemaInfo);

Параметры

source
XAttribute

Объект XAttribute для проверки.

partialValidationType
XmlSchemaObject

XmlSchemaObject, задающий проверяемое поддерево.

schemas
XmlSchemaSet

XmlSchemaSet для проверки на соответствие.

validationEventHandler
ValidationEventHandler

ValidationEventHandler для события, которое происходит, когда читатель встречает ошибки проверки. При значении null генерируется исключение возникновения ошибок проверки.

addSchemaInfo
Boolean

Boolean, указывающий, требуется ли заполнение набором сведений после проверки схемы (PSVI).

Исключения

Генерируется для ошибок проверки XSD.

Примеры

C#
                static void DumpInvalidNodes(XElement el)  
{  
    if (el.GetSchemaInfo().Validity != XmlSchemaValidity.Valid)  
        Console.WriteLine("Invalid Element {0}",  
            el.AncestorsAndSelf()  
            .InDocumentOrder()  
            .Aggregate("", (s, i) => s + "/" + i.Name.ToString()));  
    foreach (XAttribute att in el.Attributes())  
        if (att.GetSchemaInfo().Validity != XmlSchemaValidity.Valid)  
            Console.WriteLine("Invalid Attribute {0}",  
                att  
                .Parent  
                .AncestorsAndSelf()  
                .InDocumentOrder()  
                .Aggregate("",  
                    (s, i) => s + "/" + i.Name.ToString()) + "/@" + att.Name.ToString()  
                );  
    foreach (XElement child in el.Elements())  
        DumpInvalidNodes(child);  
}  

static void Main(string[] args)  
{  
    string xsdMarkup =  
        @"<xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'>  
       <xsd:element name='Root'>  
        <xsd:complexType>  
         <xsd:simpleContent>  
          <xsd:extension base='xsd:string'>  
           <xsd:attribute name='Lang' use='required'>  
            <xsd:simpleType>  
             <xsd:restriction base='xsd:token'>  
              <xsd:enumeration value='C#'/>  
              <xsd:enumeration value='VB'/>  
             </xsd:restriction>  
            </xsd:simpleType>  
           </xsd:attribute>  
          </xsd:extension>  
         </xsd:simpleContent>  
        </xsd:complexType>  
       </xsd:element>  
      </xsd:schema>";  

    XmlSchemaSet schemas = new XmlSchemaSet();  
    schemas.Add("", XmlReader.Create(new StringReader(xsdMarkup)));  

    XDocument doc1 = new XDocument(  
        new XElement("Root",  
            new XAttribute("Lang", "C#")  
        )  
    );  

    Console.WriteLine("Validating doc1 ...");  
    bool errors = false;  
    doc1.Validate(schemas, (sender, e) =>  
    {  
        Console.WriteLine(e.Message);  
        errors = true;  
    }, true);  
    Console.WriteLine("doc1 {0}", errors ? "did not validate" : "validated");  
    DumpInvalidNodes(doc1.Root);  

    Console.WriteLine();  
    Console.WriteLine("Validating Lang attribute ...");  
    XAttribute lang = doc1.Element("Root").Attribute("Lang");  

    errors = false;  
    lang.Validate(lang.GetSchemaInfo().SchemaAttribute, schemas, (sender, e) =>  
    {  
        Console.WriteLine(e.Message);  
        errors = true;  
    }, true);  
    Console.WriteLine("lang {0}", errors ? "did not validate" : "validated");  
    DumpInvalidNodes(doc1.Root);  

    // the following makes the Lang attribute invalid according to the schema  
    lang.Value = "VC";  

    Console.WriteLine();  
    Console.WriteLine("Validating Lang attribute ...");  

    errors = false;  
    lang.Validate(lang.GetSchemaInfo().SchemaAttribute, schemas, (sender, e) =>  
    {  
        Console.WriteLine(e.Message);  
        errors = true;  
    }, true);  
    Console.WriteLine("lang {0}", errors ? "did not validate" : "validated");  
    DumpInvalidNodes(doc1.Root);  
}  

В этом примере выводятся следующие данные:

Validating doc1 ...  
doc1 validated  

Validating Lang attribute ...  
lang validated  

Validating Lang attribute ...  
The 'Lang' attribute is invalid - The value 'VC' is invalid according to its datatype 'Token' - The Enumeration constraint failed.  
lang did not validate  
Invalid Attribute /Root/@Lang  

Комментарии

Этот метод можно использовать для проверки XAttribute соответствия объекта схеме. Обычно этот метод используется при изменении атрибута и требуется убедиться, что он по-прежнему соответствует его схеме. Вы можете проверить весь документ, но для проверки только атрибута требуется меньше времени на обработку.

Если addSchemaInfo имеет значение true, этот метод заполняет атрибут набором сведений после проверки схемы (PSVI). После заполнения XML-дерева PSVI можно вызвать Extensions.GetSchemaInfo для проверенного атрибута. Это полезно при написании кода, который зависит от данных, возвращаемых .GetSchemaInfo

Если передать null для validationEventHandler, этот метод создает исключение при ошибках проверки. Предупреждения проверки не будут вызывать исключение.

Для проверки атрибута используется экземпляр XmlSchemaObject. Этот экземпляр можно получить различными способами. Простой способ заключается в следующем:

  1. Проверка соответствия документа схеме.

  2. Добавьте набор сведений после проверки схемы (PSVI), вызвав Validate метод расширения.

  3. GetSchemaInfo Вызовите метод расширения, чтобы получить объект, реализующий IXmlSchemaInfo. Из полученного объекта можно получить .XmlSchemaObject

После создания экземпляра XmlSchemaObjectможно использовать этот метод для проверки атрибута.

Применяется к

.NET 9 и другие версии
Продукт Версии
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

Validate(XElement, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler, Boolean)

Исходный код:
XNodeValidator.cs
Исходный код:
XNodeValidator.cs
Исходный код:
XNodeValidator.cs

Проверяет поддерево XElement на соответствие указанным XmlSchemaObject и XmlSchemaSet, с возможностью заполнения дерева XML набором сведений после проверки схемы (PSVI).

C#
public static void Validate (this System.Xml.Linq.XElement source, System.Xml.Schema.XmlSchemaObject partialValidationType, System.Xml.Schema.XmlSchemaSet schemas, System.Xml.Schema.ValidationEventHandler? validationEventHandler, bool addSchemaInfo);
C#
public static void Validate (this System.Xml.Linq.XElement source, System.Xml.Schema.XmlSchemaObject partialValidationType, System.Xml.Schema.XmlSchemaSet schemas, System.Xml.Schema.ValidationEventHandler validationEventHandler, bool addSchemaInfo);

Параметры

source
XElement

Объект XElement для проверки.

partialValidationType
XmlSchemaObject

XmlSchemaObject, задающий проверяемое поддерево.

schemas
XmlSchemaSet

XmlSchemaSet для проверки на соответствие.

validationEventHandler
ValidationEventHandler

ValidationEventHandler для события, которое происходит, когда читатель встречает ошибки проверки. При значении null генерируется исключение возникновения ошибок проверки.

addSchemaInfo
Boolean

Boolean, указывающий, требуется ли заполнение набором сведений после проверки схемы (PSVI).

Исключения

Генерируется для ошибок проверки XSD.

Примеры

C#
                string xsdMarkup =  
    @"<xsd:schema xmlns:xsd='http://www.w3.org/2001/XMLSchema'>  
       <xsd:element name='Root'>  
        <xsd:complexType>  
         <xsd:sequence>  
          <xsd:element name='Child1' minOccurs='1' maxOccurs='1'/>  
          <xsd:element name='Child2' minOccurs='1' maxOccurs='1'>  
           <xsd:complexType>  
            <xsd:simpleContent>  
             <xsd:extension base='xsd:string'>  
              <xsd:attribute name='Att1' default='Att1 Default Value'/>  
             </xsd:extension>  
            </xsd:simpleContent>  
           </xsd:complexType>  
          </xsd:element>  
         </xsd:sequence>  
        </xsd:complexType>  
       </xsd:element>  
      </xsd:schema>";  
XmlSchemaSet schemas = new XmlSchemaSet();  
schemas.Add("", XmlReader.Create(new StringReader(xsdMarkup)));  

XDocument doc1 = new XDocument(  
    new XElement("Root",  
        new XElement("Child1", "c1"),  
        new XElement("Child2", "c2")  
    )  
);  

XDocument doc2 = new XDocument(  
    new XElement("Root",  
        new XElement("Child1", "content1"),  
        new XElement("Child3", "content1")  
    )  
);  

Console.WriteLine("Validating doc1");  
bool errors = false;  
doc1.Validate(schemas, (o, e) =>  
                     {  
                         Console.WriteLine("{0}", e.Message);  
                         errors = true;  
                     }, true);  
Console.WriteLine("doc1 {0}", errors ? "did not validate" : "validated");  

Console.WriteLine();  
Console.WriteLine("Validating doc2");  
errors = false;  
doc2.Validate(schemas, (o, e) =>  
                     {  
                         Console.WriteLine("{0}", e.Message);  
                         errors = true;  
                     }, true);  
Console.WriteLine("doc2 {0}", errors ? "did not validate" : "validated");  

Console.WriteLine();  
Console.WriteLine("Contents of doc1:");  
Console.WriteLine(doc1);  

Console.WriteLine();  
Console.WriteLine("Contents of doc2:");  
Console.WriteLine(doc2);  

В этом примере выводятся следующие данные:

Validating doc1  
doc1 validated  

Validating doc2  
The element 'Root' has invalid child element 'Child3'. List of possible elements expected: 'Child2'.  
doc2 did not validate  

Contents of doc1:  
<Root>  
  <Child1>c1</Child1>  
  <Child2 Att1="Att1 Default Value">c2</Child2>  
</Root>  

Contents of doc2:  
<Root>  
  <Child1>content1</Child1>  
  <Child3>content1</Child3>  
</Root>  

Комментарии

Этот метод можно использовать для проверки соответствия вложенного дерева (с элементом XElement в корне вложенного дерева) схеме. Обычно этот метод используется при изменении вложенного дерева и требуется убедиться, что оно по-прежнему соответствует его схеме. Вы можете проверить весь документ, но для проверки только вложенного дерева требуется меньше времени.

Если addSchemaInfo имеет значение true, этот метод заполняет xml-дерево набором сведений после проверки схемы (PSVI).

Существует два аспекта заполнения ДЕРЕВА XML с помощью PSVI.

Во-первых, на все узлы в дереве добавляется заметка, которую теперь можно вызвать GetSchemaInfo для элемента или атрибута в дереве.

Во-вторых, элементы и атрибуты по умолчанию, определенные в XSD, добавляются в XML-дерево. Вызвав один из GetSchemaInfo методов, можно определить, был ли добавлен определенный элемент или атрибут из XSD в качестве элемента или атрибута по умолчанию.

Если передать null для validationEventHandler, этот метод создает исключение при ошибках проверки. Предупреждения проверки не будут вызывать исключение.

Для проверки вложенного дерева используется экземпляр XmlSchemaObject. Этот экземпляр можно получить различными способами. Простой способ заключается в следующем:

  1. Проверка соответствия документа схеме.

  2. Добавьте набор сведений после проверки схемы (PSVI), вызвав Validate метод расширения.

  3. GetSchemaInfo Вызовите метод расширения, чтобы получить объект, реализующий IXmlSchemaInfo. Из полученного объекта можно получить .XmlSchemaObject

После создания экземпляра XmlSchemaObjectможно использовать этот метод для проверки вложенного дерева.

Применяется к

.NET 9 и другие версии
Продукт Версии
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1