Extensions.Validate Methode
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Validiert, ob ein XDocument, ein XElement oder ein XAttribute einer XSD in einem XmlSchemaSet entspricht.
Überlädt
Validate(XDocument, XmlSchemaSet, ValidationEventHandler) |
Diese Methode validiert, ob ein XDocument einer XSD in einem XmlSchemaSet entspricht. |
Validate(XAttribute, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler) |
Diese Methode validiert, ob ein XAttribute einem angegebenen XmlSchemaObject und einem XmlSchemaSet entspricht. |
Validate(XDocument, XmlSchemaSet, ValidationEventHandler, Boolean) |
Validiert, ob ein XDocument einer XSD in einem XmlSchemaSet entspricht, und füllt die XML-Struktur optional mit dem Post-Schema-Validation-Infoset (PSVI) auf. |
Validate(XElement, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler) |
Diese Methode validiert, ob eine XElement-Teilstruktur einem angegebenen XmlSchemaObject und einem XmlSchemaSet entspricht. |
Validate(XAttribute, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler, Boolean) |
Validiert, ob ein XAttribute einem angegebenen XmlSchemaObject und einem XmlSchemaSet entspricht, und füllt die XML-Struktur optional mit dem Post-Schema-Validation-Infoset (PSVI) auf. |
Validate(XElement, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler, Boolean) |
Validiert, ob eine XElement-Teilstruktur einem angegebenen XmlSchemaObject und einem XmlSchemaSet entspricht, und füllt die XML-Struktur optional mit dem Post-Schema-Validation-Infoset (PSVI) auf. |
Hinweise
Diese Methoden verwenden eine zugrunde liegende XmlReader Methode, um die XML-Struktur für eine XSD zu überprüfen.
Überprüfungsfehler und Warnungsmeldungen werden mithilfe der ValidationEventHandler Stellvertretung behandelt. Wenn kein Ereignishandler für diese Methoden bereitgestellt wird, werden Validierungsfehler als XmlSchemaValidationExceptionEins verfügbar gemacht. Überprüfungswarnungen führen nicht dazu, dass eine XmlSchemaValidationException Verschiebung ausgelöst wird.
Einige dieser Erweiterungsmethoden ermöglichen optional die Bevölkerung des Post-Schema-Validation-Infosets (PSVI).
Validate(XDocument, XmlSchemaSet, ValidationEventHandler)
Diese Methode validiert, ob ein XDocument einer XSD in einem XmlSchemaSet entspricht.
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)
Parameter
- schemas
- XmlSchemaSet
Ein XmlSchemaSet, gegen das geprüft wird.
- validationEventHandler
- ValidationEventHandler
Ein ValidationEventHandler für ein Ereignis, das eintritt, wenn der Reader Validierungsfehler empfängt. Mit dem Wert null
wird bei Validierungsfehlern eine Ausnahme ausgelöst.
Ausnahmen
Wird bei XSD (XML Schema Definition Language)-Validierungsfehlern ausgelöst.
Beispiele
Das folgende Beispiel erstellt ein XmlSchemaSet und validiert dann anhand des Schemasatzes die beiden XDocument-Objekte. Eines der Dokumente ist gültig, das andere nicht.
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
Dieses Beispiel erzeugt die folgende Ausgabe:
Validating doc1
doc1 validated
Validating doc2
The element 'Root' has invalid child element 'Child3'. List of possible elements expected: 'Child2'.
doc2 did not validate
Hinweise
Diese Erweiterungsmethode überprüft, dass das XDocument Schemainhaltsmodell in XmlSchemaSet.
Gilt für
Validate(XAttribute, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler)
Diese Methode validiert, ob ein XAttribute einem angegebenen XmlSchemaObject und einem XmlSchemaSet entspricht.
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)
Parameter
- source
- XAttribute
Der zu überprüfende XAttribute.
- partialValidationType
- XmlSchemaObject
Ein XmlSchemaObject, das die zu validierende Teilstruktur angibt.
- schemas
- XmlSchemaSet
Ein XmlSchemaSet, gegen das geprüft wird.
- validationEventHandler
- ValidationEventHandler
Ein ValidationEventHandler für ein Ereignis, das eintritt, wenn der Reader Validierungsfehler empfängt. Mit dem Wert null
wird bei Validierungsfehlern eine Ausnahme ausgelöst.
Ausnahmen
Wird bei XSD (XML Schema Definition Language)-Validierungsfehlern ausgelöst.
Beispiele
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
Dieses Beispiel erzeugt die folgende Ausgabe:
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
Hinweise
Sie können diese Methode verwenden, um zu überprüfen, ob ein XAttribute Schema entspricht. Sie verwenden diese Methode in der Regel, wenn Sie ein Attribut geändert haben, und Sie möchten sicherstellen, dass sie weiterhin dem Schema entspricht. Sie können das gesamte Dokument überprüfen, aber es dauert weniger Verarbeitungszeit, um nur das Attribut zu überprüfen.
Wenn Sie null
übergeben validationEventHandler
werden, löst diese Methode eine Ausnahme nach Überprüfungsfehlern aus. Überprüfungswarnungen werden keine Ausnahme auslösen.
Um ein Attribut zu überprüfen, verwenden Sie eine Instanz von XmlSchemaObject. Sie können diese Instanz auf verschiedene Arten abrufen. Eine einfache Methode ist wie folgt:
Überprüfen Sie, ob ein Dokument einem Schema entspricht.
Fügen Sie das Post-Schema-Validation-Infoset (PSVI) hinzu, indem Sie die Validate Erweiterungsmethode aufrufen.
Rufen Sie die GetSchemaInfo Erweiterungsmethode IXmlSchemaInfoauf, um ein Objekt abzurufen, das implementiert wird. Aus dem abgerufenen Objekt können Sie eine XmlSchemaObject.
Wenn Sie eine XmlSchemaObject für eine XElement, die Art erhalten, wird der Typ sein XmlSchemaElement.
Wenn Sie eine XmlSchemaObject für eine XAttribute, die Art erhalten, wird der Typ sein XmlSchemaAttribute.
Nachdem Sie über eine Instanz einer Instanz einer XmlSchemaObjectMethode verfügen, können Sie diese Methode verwenden, um ein Attribut zu überprüfen.
Gilt für
Validate(XDocument, XmlSchemaSet, ValidationEventHandler, Boolean)
Validiert, ob ein XDocument einer XSD in einem XmlSchemaSet entspricht, und füllt die XML-Struktur optional mit dem Post-Schema-Validation-Infoset (PSVI) auf.
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)
Parameter
- schemas
- XmlSchemaSet
Ein XmlSchemaSet, gegen das geprüft wird.
- validationEventHandler
- ValidationEventHandler
Ein ValidationEventHandler für ein Ereignis, das eintritt, wenn der Reader Validierungsfehler empfängt. Mit dem Wert null
wird bei Validierungsfehlern eine Ausnahme ausgelöst.
- addSchemaInfo
- Boolean
Ein Boolean, der angibt, ob das Post-Schema-Validation-Infoset (PSVI) aufgefüllt werden soll.
Ausnahmen
Wird bei XSD (XML Schema Definition Language)-Validierungsfehlern ausgelöst.
Beispiele
Im folgenden Beispiel wird ein XSD-Element mit einem Att1
Attribut mit einem Standardwert definiertChild2
. Nachdem das Dokument erfolgreich überprüft wurde, wird das Attribut mit dem Standardwert der XML-Struktur hinzugefügt. Beachten Sie, dass das Standardattribute nicht hinzugefügt doc2
wird, was nicht für das Schema überprüft wird.
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
Dieses Beispiel erzeugt die folgende Ausgabe:
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>
Im folgenden Beispiel wird die Struktur mit PSVI aufgefüllt. Nach der Überprüfung werden alle Elemente und Attribute in der Struktur gedruckt, die gemäß der PSVI ungültig sind.
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
Dieses Beispiel erzeugt die folgende Ausgabe:
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
Hinweise
Diese Erweiterungsmethode überprüft, dass das XDocument Schemainhaltsmodell in XmlSchemaSet.
Wenn addSchemaInfo
dies true
der Fall ist, füllt diese Methode die XML-Struktur mit dem Nach-Schema-Validierungs-Infoset (PSVI).
Es gibt zwei Schritte zum Auffüllen der XML-Struktur mit dem PSVI.
Zunächst wird einer Anmerkung alle Knoten in der Struktur hinzugefügt, damit Sie ein Element oder Attribut in der Struktur aufrufen oder Extensions.GetSchemaInfo aufrufen Extensions.GetSchemaInfo können.
Zweitens werden Standardelemente und Attribute, die in der XSD definiert sind, der XML-Struktur hinzugefügt. Durch Aufrufen einer der GetSchemaInfo Methoden können Sie bestimmen, ob ein bestimmtes Element oder Attribut aus dem XSD als Standardelement oder Attribut hinzugefügt wurde.
Gilt für
Validate(XElement, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler)
Diese Methode validiert, ob eine XElement-Teilstruktur einem angegebenen XmlSchemaObject und einem XmlSchemaSet entspricht.
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)
Parameter
- partialValidationType
- XmlSchemaObject
Ein XmlSchemaObject, das die zu validierende Teilstruktur angibt.
- schemas
- XmlSchemaSet
Ein XmlSchemaSet, gegen das geprüft wird.
- validationEventHandler
- ValidationEventHandler
Ein ValidationEventHandler für ein Ereignis, das eintritt, wenn der Reader Validierungsfehler empfängt. Mit dem Wert null
wird bei Validierungsfehlern eine Ausnahme ausgelöst.
Ausnahmen
Wird bei XSD (XML Schema Definition Language)-Validierungsfehlern ausgelöst.
Beispiele
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
Dieses Beispiel erzeugt die folgende Ausgabe:
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
Hinweise
Sie können diese Methode verwenden, um zu überprüfen, ob eine Unterstruktur (mit XElement einem Stamm) einem Schema entspricht. Sie verwenden diese Methode in der Regel, wenn Sie eine Unterstruktur geändert haben, und Sie möchten sicherstellen, dass sie weiterhin dem Schema entspricht. Sie können das gesamte Dokument überprüfen, aber es dauert weniger Verarbeitungszeit, um eine nur eine Unterstruktur zu überprüfen.
Wenn Sie für diese Methode übergeben null
werden, löst diese Methode eine Ausnahme bei validationEventHandler
Überprüfungsfehlern aus. Überprüfungswarnungen werden keine Ausnahme auslösen.
Um eine Unterstruktur zu überprüfen, verwenden Sie eine Instanz von XmlSchemaObject. Sie können diese Instanz auf verschiedene Arten abrufen. Eine einfache Möglichkeit ist wie folgt:
Überprüfen Sie, ob ein Dokument einem Schema entspricht.
Fügen Sie das Infoset für die Postschemaüberprüfung (PSVI) hinzu, indem Sie die Validate Erweiterungsmethode aufrufen.
Rufen Sie die GetSchemaInfo Erweiterungsmethode auf, um ein Objekt abzurufen, das implementiert wird IXmlSchemaInfo. Aus dem abgerufenen Objekt können Sie ein XmlSchemaObject.
Wenn Sie einen XmlSchemaObject für einen XElement, den Typ erhalten, lautet XmlSchemaElementder Typ .
Wenn Sie einen XmlSchemaObject für einen XAttribute, den Typ erhalten, lautet XmlSchemaAttributeder Typ .
Nachdem Sie über eine Instanz einer Instanz eines XmlSchemaObjectElements verfügen, können Sie diese Methode verwenden, um eine Unterstruktur zu überprüfen.
Gilt für
Validate(XAttribute, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler, Boolean)
Validiert, ob ein XAttribute einem angegebenen XmlSchemaObject und einem XmlSchemaSet entspricht, und füllt die XML-Struktur optional mit dem Post-Schema-Validation-Infoset (PSVI) auf.
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)
Parameter
- source
- XAttribute
Der zu überprüfende XAttribute.
- partialValidationType
- XmlSchemaObject
Ein XmlSchemaObject, das die zu validierende Teilstruktur angibt.
- schemas
- XmlSchemaSet
Ein XmlSchemaSet, gegen das geprüft wird.
- validationEventHandler
- ValidationEventHandler
Ein ValidationEventHandler für ein Ereignis, das eintritt, wenn der Reader Validierungsfehler empfängt. Mit dem Wert null
wird bei Validierungsfehlern eine Ausnahme ausgelöst.
- addSchemaInfo
- Boolean
Ein Boolean, der angibt, ob das Post-Schema-Validation-Infoset (PSVI) aufgefüllt werden soll.
Ausnahmen
Wird bei XSD (XML Schema Definition Language)-Validierungsfehlern ausgelöst.
Beispiele
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
Dieses Beispiel erzeugt die folgende Ausgabe:
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
Hinweise
Sie können diese Methode verwenden, um zu überprüfen, ob ein XAttribute Schema entspricht. Sie verwenden diese Methode in der Regel, wenn Sie ein Attribut geändert haben, und Sie möchten sicherstellen, dass es weiterhin seinem Schema entspricht. Sie könnten das gesamte Dokument überprüfen, aber es dauert weniger Verarbeitungszeit, um nur das Attribut zu überprüfen.
Wenn addSchemaInfo
dies der Fall ist true
, füllt diese Methode das Attribut mit dem Infoset für die Postschemaüberprüfung (PSVI) auf. Nachdem Sie die XML-Struktur mit der PSVI ausgefüllt haben, können Sie das validierte Attribut aufrufen Extensions.GetSchemaInfo . Dies ist nützlich, wenn Sie Code schreiben, der auf daten basiert, die von GetSchemaInfo.
Wenn Sie übergeben null
validationEventHandler
werden, löst diese Methode bei Überprüfungsfehlern eine Ausnahme aus. Überprüfungswarnungen lösen keine Ausnahme aus.
Zum Überprüfen eines Attributs verwenden Sie eine Instanz von XmlSchemaObject. Sie können diese Instanz auf verschiedene Arten abrufen. Eine einfache Möglichkeit ist wie folgt:
Überprüfen Sie, ob ein Dokument einem Schema entspricht.
Fügen Sie das Infoset für die Postschemaüberprüfung (PSVI) hinzu, indem Sie die Validate Erweiterungsmethode aufrufen.
Rufen Sie die GetSchemaInfo Erweiterungsmethode auf, um ein Objekt abzurufen, das implementiert wird IXmlSchemaInfo. Aus dem abgerufenen Objekt können Sie ein XmlSchemaObject.
Wenn Sie einen XmlSchemaObject für einen XElement, den Typ erhalten, lautet XmlSchemaElementder Typ .
Wenn Sie einen XmlSchemaObject für einen XAttribute, den Typ erhalten, lautet XmlSchemaAttributeder Typ .
Nachdem Sie über eine Instanz einer Instanz eines XmlSchemaObjectAttributs verfügen, können Sie diese Methode verwenden, um ein Attribut zu überprüfen.
Gilt für
Validate(XElement, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler, Boolean)
Validiert, ob eine XElement-Teilstruktur einem angegebenen XmlSchemaObject und einem XmlSchemaSet entspricht, und füllt die XML-Struktur optional mit dem Post-Schema-Validation-Infoset (PSVI) auf.
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)
Parameter
- partialValidationType
- XmlSchemaObject
Ein XmlSchemaObject, das die zu validierende Teilstruktur angibt.
- schemas
- XmlSchemaSet
Ein XmlSchemaSet, gegen das geprüft wird.
- validationEventHandler
- ValidationEventHandler
Ein ValidationEventHandler für ein Ereignis, das eintritt, wenn der Reader Validierungsfehler empfängt. Mit dem Wert null
wird bei Validierungsfehlern eine Ausnahme ausgelöst.
- addSchemaInfo
- Boolean
Ein Boolean, der angibt, ob das Post-Schema-Validation-Infoset (PSVI) aufgefüllt werden soll.
Ausnahmen
Wird bei XSD (XML Schema Definition Language)-Validierungsfehlern ausgelöst.
Beispiele
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
Dieses Beispiel erzeugt die folgende Ausgabe:
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>
Hinweise
Sie können diese Methode verwenden, um zu überprüfen, ob eine Unterstruktur (mit einer XElement am Stamm der Unterstruktur) einem Schema entspricht. Sie verwenden diese Methode in der Regel, wenn Sie eine Unterstruktur geändert haben, und Sie möchten sicherstellen, dass sie weiterhin dem Schema entspricht. Sie könnten das gesamte Dokument überprüfen, aber es dauert weniger Verarbeitungszeit, um eine nur eine Unterstruktur zu überprüfen.
Wenn addSchemaInfo
dies der Fall ist true
, füllt diese Methode die XML-Struktur mit dem Infoset (Post-Schema-Validation Infoset, PSVI) auf.
Es gibt zwei Aspekte der Auffüllung der XML-Struktur mit der PSVI.
Zunächst wird einer Anmerkung alle Knoten in der Struktur hinzugefügt, sodass Sie jetzt ein Element oder Attribut in der Struktur aufrufen GetSchemaInfo können.
Zweitens werden standardelemente und Attribute, die in der XSD definiert sind, der XML-Struktur hinzugefügt. Durch Aufrufen einer der GetSchemaInfo Methoden können Sie ermitteln, ob ein bestimmtes Element oder Attribut aus dem XSD als Standardelement oder Attribut hinzugefügt wurde.
Wenn Sie übergeben null
validationEventHandler
werden, löst diese Methode bei Überprüfungsfehlern eine Ausnahme aus. Überprüfungswarnungen lösen keine Ausnahme aus.
Um eine Unterstruktur zu überprüfen, verwenden Sie eine Instanz von XmlSchemaObject. Sie können diese Instanz auf verschiedene Arten abrufen. Eine einfache Möglichkeit ist wie folgt:
Überprüfen Sie, ob ein Dokument einem Schema entspricht.
Fügen Sie das Infoset für die Postschemaüberprüfung (PSVI) hinzu, indem Sie die Validate Erweiterungsmethode aufrufen.
Rufen Sie die GetSchemaInfo Erweiterungsmethode auf, um ein Objekt abzurufen, das implementiert wird IXmlSchemaInfo. Aus dem abgerufenen Objekt können Sie ein XmlSchemaObject.
Wenn Sie einen XmlSchemaObject für einen XElement, den Typ erhalten, lautet XmlSchemaElementder Typ .
Wenn Sie einen XmlSchemaObject für einen XAttribute, den Typ erhalten, lautet XmlSchemaAttributeder Typ .
Nachdem Sie über eine Instanz einer Instanz eines XmlSchemaObjectElements verfügen, können Sie diese Methode verwenden, um eine Unterstruktur zu überprüfen..