Extensions.Validate Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Проверяет, соответствует ли XDocumentXSD или XElementXAttribute объекту XSD в объектеXmlSchemaSet.
Перегрузки
Комментарии
Эти методы используют базовый код XmlReader для проверки XML-дерева на основе XSD.
Сообщения об ошибках проверки и предупреждениях обрабатываются с помощью делегата ValidationEventHandler . Если обработчик событий не предоставляется этим методам, ошибки проверки предоставляются в виде XmlSchemaValidationException. Предупреждения проверки не вызывают XmlSchemaValidationException возникновения ошибки.
Некоторые из этих методов расширения при необходимости разрешают заполнение набора сведений после проверки схемы (PSVI).
Validate(XDocument, XmlSchemaSet, ValidationEventHandler)
- Исходный код:
- XNodeValidator.cs
- Исходный код:
- XNodeValidator.cs
- Исходный код:
- XNodeValidator.cs
- Исходный код:
- XNodeValidator.cs
- Исходный код:
- XNodeValidator.cs
Этот метод проверяет соответствие XDocument XSD в объекте XmlSchemaSet.
public:
[System::Runtime::CompilerServices::Extension]
static void Validate(System::Xml::Linq::XDocument ^ source, System::Xml::Schema::XmlSchemaSet ^ schemas, System::Xml::Schema::ValidationEventHandler ^ validationEventHandler);
public static void Validate(this System.Xml.Linq.XDocument source, System.Xml.Schema.XmlSchemaSet schemas, System.Xml.Schema.ValidationEventHandler? validationEventHandler);
public static void Validate(this System.Xml.Linq.XDocument source, System.Xml.Schema.XmlSchemaSet schemas, System.Xml.Schema.ValidationEventHandler validationEventHandler);
static member Validate : System.Xml.Linq.XDocument * System.Xml.Schema.XmlSchemaSet * System.Xml.Schema.ValidationEventHandler -> unit
<Extension()>
Public Sub Validate (source As XDocument, schemas As XmlSchemaSet, validationEventHandler As ValidationEventHandler)
Параметры
- schemas
- XmlSchemaSet
Проверка XmlSchemaSet на соответствие.
- validationEventHandler
- ValidationEventHandler
Событие ValidationEventHandler , возникающее при возникновении ошибок проверки средства чтения. Если nullпри проверке возникает исключение.
Исключения
Возникают ошибки проверки языка определения схемы XML (XSD).
Примеры
В следующем примере создается объект XmlSchemaSet, а затем проверяется два XDocument объекта в наборе схем. Один из документов является допустимым, другой — нет.
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");
Dim errors As Boolean = False
Private Sub XSDErrors(ByVal o As Object, ByVal e As ValidationEventArgs)
Console.WriteLine("{0}", e.Message)
errors = True
End Sub
Sub Main()
Dim xsdMarkup As XDocument = _
<?xml version='1.0'?>
<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>
Dim schemas As XmlSchemaSet = New XmlSchemaSet()
schemas.Add("", xsdMarkup.CreateReader)
Dim doc1 As XDocument = _
<?xml version='1.0'?>
<Root>
<Child1>content1</Child1>
<Child2>content2</Child2>
</Root>
Dim doc2 As XDocument = _
<?xml version='1.0'?>
<Root>
<Child1>content1</Child1>
<Child3>content1</Child3>
</Root>
Console.WriteLine("Validating doc1")
errors = False
doc1.Validate(schemas, AddressOf XSDErrors)
Console.WriteLine("doc1 {0}", IIf(errors, "did not validate", "validated"))
Console.WriteLine()
Console.WriteLine("Validating doc2")
errors = False
doc2.Validate(schemas, AddressOf XSDErrors)
Console.WriteLine("doc2 {0}", IIf(errors, "did not validate", "validated"))
End Sub
В примере получается следующий вывод.
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.
Применяется к
Validate(XAttribute, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler)
- Исходный код:
- XNodeValidator.cs
- Исходный код:
- XNodeValidator.cs
- Исходный код:
- XNodeValidator.cs
- Исходный код:
- XNodeValidator.cs
- Исходный код:
- XNodeValidator.cs
Этот метод проверяет соответствие XAttribute заданному и заданному XmlSchemaObjectXmlSchemaSet.
public:
[System::Runtime::CompilerServices::Extension]
static void Validate(System::Xml::Linq::XAttribute ^ source, System::Xml::Schema::XmlSchemaObject ^ partialValidationType, System::Xml::Schema::XmlSchemaSet ^ schemas, System::Xml::Schema::ValidationEventHandler ^ validationEventHandler);
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);
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);
static member Validate : System.Xml.Linq.XAttribute * System.Xml.Schema.XmlSchemaObject * System.Xml.Schema.XmlSchemaSet * System.Xml.Schema.ValidationEventHandler -> unit
<Extension()>
Public Sub Validate (source As XAttribute, partialValidationType As XmlSchemaObject, schemas As XmlSchemaSet, validationEventHandler As ValidationEventHandler)
Параметры
- source
- XAttribute
Проверка XAttribute .
- partialValidationType
- XmlSchemaObject
Значение XmlSchemaObject , указывающее под дерево для проверки.
- schemas
- XmlSchemaSet
Проверка XmlSchemaSet на соответствие.
- validationEventHandler
- ValidationEventHandler
Событие ValidationEventHandler , возникающее при возникновении ошибок проверки средства чтения. Если nullпри проверке возникает исключение.
Исключения
Возникают ошибки проверки языка определения схемы XML (XSD).
Примеры
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");
Dim errors As Boolean = False
Private Sub XSDErrors(ByVal o As Object, ByVal e As ValidationEventArgs)
Console.WriteLine("{0}", e.Message)
errors = True
End Sub
Sub Main()
Dim xsdMarkup As XDocument = _
<?xml version='1.0'?>
<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>
Dim schemas As XmlSchemaSet = New XmlSchemaSet()
schemas.Add("", xsdMarkup.CreateReader)
Dim doc1 As XDocument = <?xml version='1.0'?>
<Root Lang='C#'/>
Console.WriteLine("Validating doc1 ...")
errors = False
doc1.Validate(schemas, AddressOf XSDErrors, True)
Console.WriteLine("doc1 {0}", IIf(errors, "did not validate", "validated"))
Console.WriteLine()
Console.WriteLine("Validating Lang attribute ...")
Dim lang As XAttribute = doc1.Root.Attribute("Lang")
errors = False
lang.Validate(lang.GetSchemaInfo().SchemaAttribute, schemas, AddressOf XSDErrors)
Console.WriteLine("lang {0}", IIf(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, AddressOf XSDErrors)
Console.WriteLine("lang {0}", IIf(errors, "did not validate", "validated"))
End Sub
В примере получается следующий вывод.
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 схеме. Обычно этот метод используется при изменении атрибута, и вы хотите убедиться, что он по-прежнему соответствует его схеме. Вы можете проверить весь документ, но для проверки атрибута требуется меньше времени обработки.
При передаче nullvalidationEventHandlerэтот метод вызывает исключение при ошибках проверки. Предупреждения проверки не вызывают исключения.
Для проверки атрибута используется экземпляр XmlSchemaObject. Этот экземпляр можно получить различными способами. Простой способ выглядит следующим образом:
Убедитесь, что документ соответствует схеме.
Добавьте набор сведений после проверки схемы (PSVI), вызвав Validate метод расширения.
GetSchemaInfo Вызовите метод расширения, чтобы получить объект, реализующий IXmlSchemaInfo. Из полученного объекта можно получить XmlSchemaObject.
Если вы получаете XmlSchemaObject для XElementобъекта, тип будет XmlSchemaElement.
Если вы получаете XmlSchemaObject для XAttributeобъекта, тип будет XmlSchemaAttribute.
После получения экземпляра можно использовать этот метод для проверки атрибута XmlSchemaObject.
Применяется к
Validate(XDocument, XmlSchemaSet, ValidationEventHandler, Boolean)
- Исходный код:
- XNodeValidator.cs
- Исходный код:
- XNodeValidator.cs
- Исходный код:
- XNodeValidator.cs
- Исходный код:
- XNodeValidator.cs
- Исходный код:
- XNodeValidator.cs
Проверяет, соответствует ли XDocument XSD в XmlSchemaSetxml-дереве при необходимости заполнение XML-дерева набором сведений после проверки схемы (PSVI).
public:
[System::Runtime::CompilerServices::Extension]
static void Validate(System::Xml::Linq::XDocument ^ source, System::Xml::Schema::XmlSchemaSet ^ schemas, System::Xml::Schema::ValidationEventHandler ^ validationEventHandler, bool addSchemaInfo);
public static void Validate(this System.Xml.Linq.XDocument source, System.Xml.Schema.XmlSchemaSet schemas, System.Xml.Schema.ValidationEventHandler? validationEventHandler, bool addSchemaInfo);
public static void Validate(this System.Xml.Linq.XDocument source, System.Xml.Schema.XmlSchemaSet schemas, System.Xml.Schema.ValidationEventHandler validationEventHandler, bool addSchemaInfo);
static member Validate : System.Xml.Linq.XDocument * System.Xml.Schema.XmlSchemaSet * System.Xml.Schema.ValidationEventHandler * bool -> unit
<Extension()>
Public Sub Validate (source As XDocument, schemas As XmlSchemaSet, validationEventHandler As ValidationEventHandler, addSchemaInfo As Boolean)
Параметры
- schemas
- XmlSchemaSet
Проверка XmlSchemaSet на соответствие.
- validationEventHandler
- ValidationEventHandler
Событие ValidationEventHandler , возникающее при возникновении ошибок проверки средства чтения. Если nullпри проверке возникает исключение.
- addSchemaInfo
- Boolean
Указывает Boolean , заполняется ли набор сведений после проверки схемы (PSVI).
Исключения
Возникают ошибки проверки языка определения схемы XML (XSD).
Примеры
В следующем примере содержится XSD, который определяет Child2 элемент с атрибутом со Att1 значением по умолчанию. После успешной проверки документа атрибут со значением по умолчанию добавляется в XML-дерево. Обратите внимание, что атрибут по умолчанию не добавляется в doc2, в который не проверяется схема.
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);
Dim errors As Boolean = False
Private Sub XSDErrors(ByVal o As Object, ByVal e As ValidationEventArgs)
Console.WriteLine("{0}", e.Message)
errors = True
End Sub
Sub Main()
Dim xsdMarkup As XDocument = _
<?xml version='1.0'?>
<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>
Dim schemas As XmlSchemaSet = New XmlSchemaSet()
schemas.Add("", xsdMarkup.CreateReader)
Dim doc1 As XDocument = <?xml version='1.0'?>
<Root>
<Child1>c1</Child1>
<Child2>c2</Child2>
</Root>
Dim doc2 As XDocument = <?xml version='1.0'?>
<Root>
<Child1>content1</Child1>
<Child3>content1</Child3>
</Root>
Console.WriteLine("Validating doc1")
errors = False
doc1.Validate(schemas, AddressOf XSDErrors, True)
Console.WriteLine("doc1 {0}", IIf(errors, "did not validate", "validated"))
Console.WriteLine()
Console.WriteLine("Validating doc2")
errors = False
doc2.Validate(schemas, AddressOf XSDErrors, True)
Console.WriteLine("doc2 {0}", IIf(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)
End Sub
В примере получается следующий вывод.
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.
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);
}
Private Sub DumpInvalidNodes(ByVal el As XElement)
If el.GetSchemaInfo.Validity <> XmlSchemaValidity.Valid Then
Console.WriteLine("Invalid Element {0}", _
el _
.AncestorsAndSelf _
.InDocumentOrder() _
.Aggregate("", _
Function(ByVal s, ByVal i) s + "/" + i.Name.ToString()))
End If
For Each att As XAttribute In el.Attributes()
If att.GetSchemaInfo.Validity <> XmlSchemaValidity.Valid Then
Console.WriteLine("Invalid Attribute {0}", _
att _
.Parent _
.AncestorsAndSelf() _
.InDocumentOrder() _
.Aggregate("", _
Function(ByVal s, ByVal i) s + "/" + i.Name.ToString()) + _
"/@" + att.Name.ToString())
End If
Next
For Each child As XElement In el.Elements()
DumpInvalidNodes(child)
Next
End Sub
Dim errors As Boolean = False
Private Sub XSDErrors(ByVal o As Object, ByVal e As ValidationEventArgs)
Console.WriteLine("{0}", e.Message)
errors = True
End Sub
Sub Main()
Dim xsdMarkup As XDocument = _
<?xml version='1.0'?>
<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>
Dim schemas As XmlSchemaSet = New XmlSchemaSet()
schemas.Add("", xsdMarkup.CreateReader)
Dim doc1 As XDocument = _
<?xml version='1.0'?>
<Root>
<Child1>
<GrandChild1>AAA</GrandChild1>
<GrandChild2>ZZZ</GrandChild2>
<GrandChild3>ZZZ</GrandChild3>
</Child1>
</Root>
Console.WriteLine("Validating doc1 ...")
errors = False
doc1.Validate(schemas, AddressOf XSDErrors, True)
Console.WriteLine("doc1 {0}", IIf(errors, "did not validate", "validated"))
DumpInvalidNodes(doc1.Root)
End Sub
В примере получается следующий вывод.
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.
Во-первых, заметка добавляется ко всем узлам в дереве, чтобы можно было вызывать Extensions.GetSchemaInfo элемент или Extensions.GetSchemaInfo атрибут в дереве.
Во-вторых, элементы и атрибуты по умолчанию, определенные в XSD, добавляются в XML-дерево. Вызывая один из GetSchemaInfo методов, можно определить, был ли добавлен определенный элемент или атрибут из XSD в качестве элемента или атрибута по умолчанию.
Применяется к
Validate(XElement, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler)
- Исходный код:
- XNodeValidator.cs
- Исходный код:
- XNodeValidator.cs
- Исходный код:
- XNodeValidator.cs
- Исходный код:
- XNodeValidator.cs
- Исходный код:
- XNodeValidator.cs
Этот метод проверяет соответствие XElement вложенного дерева указанному и заданному XmlSchemaObjectXmlSchemaSet.
public:
[System::Runtime::CompilerServices::Extension]
static void Validate(System::Xml::Linq::XElement ^ source, System::Xml::Schema::XmlSchemaObject ^ partialValidationType, System::Xml::Schema::XmlSchemaSet ^ schemas, System::Xml::Schema::ValidationEventHandler ^ validationEventHandler);
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);
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);
static member Validate : System.Xml.Linq.XElement * System.Xml.Schema.XmlSchemaObject * System.Xml.Schema.XmlSchemaSet * System.Xml.Schema.ValidationEventHandler -> unit
<Extension()>
Public Sub Validate (source As XElement, partialValidationType As XmlSchemaObject, schemas As XmlSchemaSet, validationEventHandler As ValidationEventHandler)
Параметры
- partialValidationType
- XmlSchemaObject
Значение XmlSchemaObject , указывающее под дерево для проверки.
- schemas
- XmlSchemaSet
Проверка XmlSchemaSet на соответствие.
- validationEventHandler
- ValidationEventHandler
Событие ValidationEventHandler , возникающее при возникновении ошибок проверки средства чтения. Если nullпри проверке возникает исключение.
Исключения
Возникают ошибки проверки языка определения схемы XML (XSD).
Примеры
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");
Dim errors As Boolean = False
Private Sub XSDErrors(ByVal o As Object, ByVal e As ValidationEventArgs)
Console.WriteLine("{0}", e.Message)
errors = True
End Sub
Sub Main()
Dim xsdMarkup As XDocument = _
<?xml version='1.0'?>
<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>
Dim schemas As XmlSchemaSet = New XmlSchemaSet()
schemas.Add("", xsdMarkup.CreateReader)
Dim doc1 As XDocument = _
<?xml version='1.0'?>
<Root>
<Child1>
<GrandChild1>gc</GrandChild1>
<GrandChild2>gc</GrandChild2>
</Child1>
</Root>
Console.WriteLine("Validating doc1 ...")
errors = False
doc1.Validate(schemas, AddressOf XSDErrors, True)
Console.WriteLine("doc1 {0}", IIf(errors, "did not validate", "validated"))
Console.WriteLine()
Console.WriteLine("Validating Child1 after first edit ...")
Dim child1 As XElement = doc1.Element("Root").Element("Child1")
child1.Add(<GrandChild2>gc</GrandChild2>)
errors = False
child1.Validate(child1.GetSchemaInfo().SchemaElement, schemas, AddressOf XSDErrors)
Console.WriteLine("child1 {0}", IIf(errors, "did not validate", "validated"))
' the following makes the Child1 element invalid according to the schema
child1.Add(<GrandChild3>gc</GrandChild3>)
Console.WriteLine()
Console.WriteLine("Validating Child1 after second edit ...")
child1.Validate(child1.GetSchemaInfo().SchemaElement, schemas, AddressOf XSDErrors)
Console.WriteLine("child1 {0}", IIf(errors, "did not validate", "validated"))
End Sub
В примере получается следующий вывод.
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 дерева (с корнем) схеме. Обычно этот метод используется при изменении вложенного дерева, и вы хотите убедиться, что он по-прежнему соответствует его схеме. Вы можете проверить весь документ, но для проверки только вложенного дерева требуется меньше времени обработки.
При передаче nullvalidationEventHandlerэтот метод вызывает исключение при ошибках проверки. Предупреждения проверки не вызывают исключения.
Для проверки вложенного дерева используется экземпляр XmlSchemaObject. Этот экземпляр можно получить различными способами. Простой способ выглядит следующим образом:
Убедитесь, что документ соответствует схеме.
Добавьте набор сведений после проверки схемы (PSVI), вызвав Validate метод расширения.
GetSchemaInfo Вызовите метод расширения, чтобы получить объект, реализующий IXmlSchemaInfo. Из полученного объекта можно получить XmlSchemaObject.
Если вы получаете XmlSchemaObject для XElementобъекта, тип будет XmlSchemaElement.
Если вы получаете XmlSchemaObject для XAttributeобъекта, тип будет XmlSchemaAttribute.
После получения экземпляра можно использовать этот метод для проверки вложенного XmlSchemaObjectдерева.
Применяется к
Validate(XAttribute, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler, Boolean)
- Исходный код:
- XNodeValidator.cs
- Исходный код:
- XNodeValidator.cs
- Исходный код:
- XNodeValidator.cs
- Исходный код:
- XNodeValidator.cs
- Исходный код:
- XNodeValidator.cs
Проверяет соответствие XAttribute заданному XmlSchemaObject и XmlSchemaSetнеобязательному заполнению XML-дерева набором сведений после проверки схемы (PSVI).
public:
[System::Runtime::CompilerServices::Extension]
static void Validate(System::Xml::Linq::XAttribute ^ source, System::Xml::Schema::XmlSchemaObject ^ partialValidationType, System::Xml::Schema::XmlSchemaSet ^ schemas, System::Xml::Schema::ValidationEventHandler ^ validationEventHandler, bool addSchemaInfo);
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);
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);
static member Validate : System.Xml.Linq.XAttribute * System.Xml.Schema.XmlSchemaObject * System.Xml.Schema.XmlSchemaSet * System.Xml.Schema.ValidationEventHandler * bool -> unit
<Extension()>
Public Sub Validate (source As XAttribute, partialValidationType As XmlSchemaObject, schemas As XmlSchemaSet, validationEventHandler As ValidationEventHandler, addSchemaInfo As Boolean)
Параметры
- source
- XAttribute
Проверка XAttribute .
- partialValidationType
- XmlSchemaObject
Значение XmlSchemaObject , указывающее под дерево для проверки.
- schemas
- XmlSchemaSet
Проверка XmlSchemaSet на соответствие.
- validationEventHandler
- ValidationEventHandler
Событие ValidationEventHandler , возникающее при возникновении ошибок проверки средства чтения. Если nullпри проверке возникает исключение.
- addSchemaInfo
- Boolean
Указывает Boolean , заполняется ли набор сведений после проверки схемы (PSVI).
Исключения
Возникают ошибки проверки языка определения схемы XML (XSD).
Примеры
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);
}
Private Sub DumpInvalidNodes(ByVal el As XElement)
If el.GetSchemaInfo.Validity <> XmlSchemaValidity.Valid Then
Console.WriteLine("Invalid Element {0}", _
el _
.AncestorsAndSelf _
.InDocumentOrder() _
.Aggregate("", _
Function(ByVal s, ByVal i) s + "/" + i.Name.ToString()))
End If
For Each att As XAttribute In el.Attributes()
If att.GetSchemaInfo.Validity <> XmlSchemaValidity.Valid Then
Console.WriteLine("Invalid Attribute {0}", _
att _
.Parent _
.AncestorsAndSelf() _
.InDocumentOrder() _
.Aggregate("", _
Function(ByVal s, ByVal i) s + "/" + i.Name.ToString()) + _
"/@" + att.Name.ToString())
End If
Next
For Each child As XElement In el.Elements()
DumpInvalidNodes(child)
Next
End Sub
Dim errors As Boolean = False
Private Sub XSDErrors(ByVal o As Object, ByVal e As ValidationEventArgs)
Console.WriteLine("{0}", e.Message)
errors = True
End Sub
Sub Main()
Dim xsdMarkup As XDocument = _
<?xml version='1.0'?>
<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>
Dim schemas As XmlSchemaSet = New XmlSchemaSet()
schemas.Add("", xsdMarkup.CreateReader)
Dim doc1 As XDocument = <?xml version='1.0'?>
<Root Lang='C#'/>
Console.WriteLine("Validating doc1 ...")
errors = False
doc1.Validate(schemas, AddressOf XSDErrors, True)
Console.WriteLine("doc1 {0}", IIf(errors, "did not validate", "validated"))
DumpInvalidNodes(doc1.Root)
Console.WriteLine()
Console.WriteLine("Validating Lang attribute ...")
Dim lang As XAttribute = doc1.Element("Root").Attribute("Lang")
errors = False
lang.Validate(lang.GetSchemaInfo().SchemaAttribute, schemas, AddressOf XSDErrors, True)
Console.WriteLine("lang {0}", IIf(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, AddressOf XSDErrors, True)
Console.WriteLine("lang {0}", IIf(errors, "did not validate", "validated"))
DumpInvalidNodes(doc1.Root)
End Sub
В примере получается следующий вывод.
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.
При передаче nullvalidationEventHandlerэтот метод вызывает исключение при ошибках проверки. Предупреждения проверки не вызывают исключения.
Для проверки атрибута используется экземпляр XmlSchemaObject. Этот экземпляр можно получить различными способами. Простой способ выглядит следующим образом:
Убедитесь, что документ соответствует схеме.
Добавьте набор сведений после проверки схемы (PSVI), вызвав Validate метод расширения.
GetSchemaInfo Вызовите метод расширения, чтобы получить объект, реализующий IXmlSchemaInfo. Из полученного объекта можно получить XmlSchemaObject.
Если вы получаете XmlSchemaObject для XElementобъекта, тип будет XmlSchemaElement.
Если вы получаете XmlSchemaObject для XAttributeобъекта, тип будет XmlSchemaAttribute.
После получения экземпляра можно использовать этот метод для проверки атрибута XmlSchemaObject.
Применяется к
Validate(XElement, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler, Boolean)
- Исходный код:
- XNodeValidator.cs
- Исходный код:
- XNodeValidator.cs
- Исходный код:
- XNodeValidator.cs
- Исходный код:
- XNodeValidator.cs
- Исходный код:
- XNodeValidator.cs
Проверяет соответствие XElement вложенного дерева указанному XmlSchemaObject и XmlSchemaSetнеобязательному заполнению XML-дерева набором сведений после проверки схемы (PSVI).
public:
[System::Runtime::CompilerServices::Extension]
static void Validate(System::Xml::Linq::XElement ^ source, System::Xml::Schema::XmlSchemaObject ^ partialValidationType, System::Xml::Schema::XmlSchemaSet ^ schemas, System::Xml::Schema::ValidationEventHandler ^ validationEventHandler, bool addSchemaInfo);
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);
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);
static member Validate : System.Xml.Linq.XElement * System.Xml.Schema.XmlSchemaObject * System.Xml.Schema.XmlSchemaSet * System.Xml.Schema.ValidationEventHandler * bool -> unit
<Extension()>
Public Sub Validate (source As XElement, partialValidationType As XmlSchemaObject, schemas As XmlSchemaSet, validationEventHandler As ValidationEventHandler, addSchemaInfo As Boolean)
Параметры
- partialValidationType
- XmlSchemaObject
Значение XmlSchemaObject , указывающее под дерево для проверки.
- schemas
- XmlSchemaSet
Проверка XmlSchemaSet на соответствие.
- validationEventHandler
- ValidationEventHandler
Событие ValidationEventHandler , возникающее при возникновении ошибок проверки средства чтения. Если nullпри проверке возникает исключение.
- addSchemaInfo
- Boolean
Указывает Boolean , заполняется ли набор сведений после проверки схемы (PSVI).
Исключения
Возникают ошибки проверки языка определения схемы XML (XSD).
Примеры
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);
Dim errors As Boolean = False
Private Sub XSDErrors(ByVal o As Object, ByVal e As ValidationEventArgs)
Console.WriteLine("{0}", e.Message)
errors = True
End Sub
Sub Main()
Dim xsdMarkup As XDocument = _
<?xml version='1.0'?>
<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>
Dim schemas As XmlSchemaSet = New XmlSchemaSet()
schemas.Add("", xsdMarkup.CreateReader)
Dim doc1 As XDocument = _
<?xml version='1.0'?>
<Root>
<Child1>c1</Child1>
<Child2>c2</Child2>
</Root>
Dim doc2 As XDocument = _
<?xml version='1.0'?>
<Root>
<Child1>content1</Child1>
<Child3>content1</Child3>
</Root>
Console.WriteLine("Validating doc1")
errors = False
doc1.Validate(schemas, AddressOf XSDErrors, True)
Console.WriteLine("doc1 {0}", IIf(errors, "did not validate", "validated"))
Console.WriteLine()
Console.WriteLine("Validating doc2")
errors = False
doc2.Validate(schemas, AddressOf XSDErrors, True)
Console.WriteLine("doc2 {0}", IIf(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)
End Sub
В примере получается следующий вывод.
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 в качестве элемента или атрибута по умолчанию.
При передаче nullvalidationEventHandlerэтот метод вызывает исключение при ошибках проверки. Предупреждения проверки не вызывают исключения.
Для проверки вложенного дерева используется экземпляр XmlSchemaObject. Этот экземпляр можно получить различными способами. Простой способ выглядит следующим образом:
Убедитесь, что документ соответствует схеме.
Добавьте набор сведений после проверки схемы (PSVI), вызвав Validate метод расширения.
GetSchemaInfo Вызовите метод расширения, чтобы получить объект, реализующий IXmlSchemaInfo. Из полученного объекта можно получить XmlSchemaObject.
Если вы получаете XmlSchemaObject для XElementобъекта, тип будет XmlSchemaElement.
Если вы получаете XmlSchemaObject для XAttributeобъекта, тип будет XmlSchemaAttribute.
После получения экземпляра можно использовать этот метод для проверки вложенного XmlSchemaObjectдерева.