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.
Überprüft, ob ein XDocument, ein XElementoder ein XAttribute XSD in einem XmlSchemaSet.
Überlädt
| Name | Beschreibung |
|---|---|
| Validate(XDocument, XmlSchemaSet, ValidationEventHandler) |
Diese Methode überprüft, ob eine XDocument XSD in einer XmlSchemaSet. |
| Validate(XAttribute, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler) |
Diese Methode überprüft, ob eine XAttribute Übereinstimmung mit einem angegebenen XmlSchemaObject und einem XmlSchemaSet. |
| Validate(XDocument, XmlSchemaSet, ValidationEventHandler, Boolean) |
Überprüft, ob ein XDocument XSD-Wert in einer XmlSchemaSetXML-Struktur entspricht, die optional die XML-Struktur mit dem Post-Schema-Validation-Infoset (PSVI) auffüllt. |
| Validate(XElement, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler) |
Diese Methode überprüft, ob eine XElement Unterstruktur einem angegebenen XmlSchemaObject und einem XmlSchemaSet. |
| Validate(XAttribute, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler, Boolean) |
Überprüft, ob eine XAttribute übereinstimmung mit einem angegebenen XmlSchemaObject und einem XmlSchemaSetoptionalen Auffüllen der XML-Struktur mit dem Post-Schema-Validation-Infoset (PSVI) übereinstimmt. |
| Validate(XElement, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler, Boolean) |
Überprüft, ob eine XElement Unterstruktur einem angegebenen XmlSchemaObject und optionalen XmlSchemaSetAuffüllen der XML-Struktur mit dem Post-Schema-Validation-Infoset (PSVI) entspricht. |
Hinweise
Diese Methoden verwenden eine zugrunde liegende XmlReader Methode, um die XML-Struktur für eine XSD zu überprüfen.
Überprüfungsfehler und Warnmeldungen werden mithilfe des ValidationEventHandler Delegaten behandelt. Wenn für diese Methoden kein Ereignishandler bereitgestellt wird, werden Validierungsfehler als .XmlSchemaValidationException Überprüfungswarnungen führen nicht dazu, dass ein XmlSchemaValidationException Fehler ausgelöst wird.
Einige dieser Erweiterungsmethoden ermöglichen optional die Population des Infosets nach schematavalidierung (PSVI).
Validate(XDocument, XmlSchemaSet, ValidationEventHandler)
Diese Methode überprüft, ob eine XDocument XSD in einer 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);
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 , der überprüft werden soll.
- validationEventHandler
- ValidationEventHandler
A ValidationEventHandler für ein Ereignis, das auftritt, wenn der Leser Auf Gültigkeitsfehler auftritt. Wenn null, löst eine Ausnahme bei Überprüfungsfehlern aus.
Ausnahmen
Wird für XSD-Überprüfungsfehler (XML Schema Definition Language) ausgelöst.
Beispiele
Im folgenden Beispiel wird ein XmlSchemaSetUnd dann zwei XDocument Objekte anhand des Schemasatzes überprüft. Eines der Dokumente ist gültig, der andere ist 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, ob das XDocument Schemainhaltsmodell in XmlSchemaSet.
Gilt für:
Validate(XAttribute, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler)
Diese Methode überprüft, ob eine XAttribute Übereinstimmung mit einem angegebenen XmlSchemaObject und einem XmlSchemaSet.
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);
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 XAttribute zu überprüfende
- partialValidationType
- XmlSchemaObject
Ein XmlSchemaObject Wert, der die zu überprüfende Unterstruktur angibt.
- schemas
- XmlSchemaSet
Ein XmlSchemaSet , der überprüft werden soll.
- validationEventHandler
- ValidationEventHandler
A ValidationEventHandler für ein Ereignis, das auftritt, wenn der Leser Auf Gültigkeitsfehler auftritt. Wenn null, löst eine Ausnahme bei Überprüfungsfehlern aus.
Ausnahmen
Wird für XSD-Überprüfungsfehler (XML Schema Definition Language) 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
Mit dieser Methode können Sie ü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önnten das gesamte Dokument überprüfen, aber es dauert weniger Verarbeitungszeit, um nur das Attribut zu überprüfen.
Wenn Sie die Methode übergeben nullvalidationEventHandler, löst diese Methode bei Überprüfungsfehlern eine Ausnahme aus. Validierungswarnungen lösen keine Ausnahme aus.
Zum Überprüfen eines Attributs verwenden Sie eine Instanz von XmlSchemaObject. Sie können diese Instanz auf verschiedene Weise abrufen. Eine einfache Möglichkeit ist wie folgt:
Überprüfen Sie, ob ein Dokument einem Schema entspricht.
Fügen Sie das Infoset nach der Schemaüberprüfung (PSVI) hinzu, indem Sie die Validate Erweiterungsmethode aufrufen.
Rufen Sie die GetSchemaInfo Erweiterungsmethode auf, um ein Objekt abzurufen, das implementiert IXmlSchemaInfowird. Aus dem abgerufenen Objekt können Sie ein XmlSchemaObject.
Wenn Sie eine XmlSchemaObject für eine XElement, dies erhalten, lautet XmlSchemaElementder Typ .
Wenn Sie eine XmlSchemaObject für eine XAttribute, dies erhalten, lautet XmlSchemaAttributeder Typ .
Nachdem Sie über eine Instanz einer Instanz verfügen XmlSchemaObject, können Sie diese Methode verwenden, um ein Attribut zu überprüfen.
Gilt für:
Validate(XDocument, XmlSchemaSet, ValidationEventHandler, Boolean)
Überprüft, ob ein XDocument XSD-Wert in einer XmlSchemaSetXML-Struktur entspricht, die optional die XML-Struktur mit dem Post-Schema-Validation-Infoset (PSVI) auffüllt.
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);
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 , der überprüft werden soll.
- validationEventHandler
- ValidationEventHandler
A ValidationEventHandler für ein Ereignis, das auftritt, wenn der Leser Auf Gültigkeitsfehler auftritt. Wenn null, löst eine Ausnahme bei Überprüfungsfehlern aus.
- addSchemaInfo
- Boolean
Ein Boolean Wert, der angibt, ob das Infoset nach der Schemaüberprüfung (PSVI) aufgefüllt werden soll.
Ausnahmen
Wird für XSD-Überprüfungsfehler (XML Schema Definition Language) ausgelöst.
Beispiele
Das folgende Beispiel enthält eine XSD, die das Child2 Element mit einem Att1 Attribut mit einem Standardwert definiert. Nach der erfolgreichen Überprüfung des Dokuments wird das Attribut mit dem Standardwert der XML-Struktur hinzugefügt. Beachten Sie, dass das Standard-Attribut nicht hinzugefügt doc2wird, das nicht anhand des Schemas ü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äß 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, ob das XDocument Schemainhaltsmodell in XmlSchemaSet.
Ist addSchemaInfo dies trueder Fall, füllt diese Methode die XML-Struktur mit dem Infoset für die Postschemaüberprüfung (PSVI) auf.
Es gibt zwei Schritte zum Auffüllen der XML-Struktur mit der PSVI.
Zunächst wird allen Knoten in der Struktur eine Anmerkung hinzugefügt, damit Sie ein Element oder Attribut in der Struktur aufrufen Extensions.GetSchemaInfo oder Extensions.GetSchemaInfo aufrufen 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.
Gilt für:
Validate(XElement, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler)
Diese Methode überprüft, ob eine XElement Unterstruktur einem angegebenen XmlSchemaObject und einem XmlSchemaSet.
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);
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 Wert, der die zu überprüfende Unterstruktur angibt.
- schemas
- XmlSchemaSet
Ein XmlSchemaSet , der überprüft werden soll.
- validationEventHandler
- ValidationEventHandler
A ValidationEventHandler für ein Ereignis, das auftritt, wenn der Leser Auf Gültigkeitsfehler auftritt. Wenn null, löst eine Ausnahme bei Überprüfungsfehlern aus.
Ausnahmen
Wird für XSD-Überprüfungsfehler (XML Schema Definition Language) 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
Mit dieser Methode können Sie überprüfen, ob eine Unterstruktur (mit einem XElement Stammbaum) einem Schema entspricht. Sie verwenden diese Methode in der Regel, wenn Sie eine Unterstruktur geändert haben und sicherstellen möchten, 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 Sie die Methode übergeben nullvalidationEventHandler, löst diese Methode bei Überprüfungsfehlern eine Ausnahme aus. Validierungswarnungen lösen keine Ausnahme aus.
Zum Überprüfen einer Unterstruktur verwenden Sie eine Instanz von XmlSchemaObject. Sie können diese Instanz auf verschiedene Weise abrufen. Eine einfache Möglichkeit ist wie folgt:
Überprüfen Sie, ob ein Dokument einem Schema entspricht.
Fügen Sie das Infoset nach der Schemaüberprüfung (PSVI) hinzu, indem Sie die Validate Erweiterungsmethode aufrufen.
Rufen Sie die GetSchemaInfo Erweiterungsmethode auf, um ein Objekt abzurufen, das implementiert IXmlSchemaInfowird. Aus dem abgerufenen Objekt können Sie ein XmlSchemaObject.
Wenn Sie eine XmlSchemaObject für eine XElement, dies erhalten, lautet XmlSchemaElementder Typ .
Wenn Sie eine XmlSchemaObject für eine XAttribute, dies erhalten, lautet XmlSchemaAttributeder Typ .
Nachdem Sie über eine Instanz einer Instanz verfügen XmlSchemaObject, können Sie diese Methode verwenden, um eine Unterstruktur zu überprüfen.
Gilt für:
Validate(XAttribute, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler, Boolean)
Überprüft, ob eine XAttribute übereinstimmung mit einem angegebenen XmlSchemaObject und einem XmlSchemaSetoptionalen Auffüllen der XML-Struktur mit dem Post-Schema-Validation-Infoset (PSVI) übereinstimmt.
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);
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 XAttribute zu überprüfende
- partialValidationType
- XmlSchemaObject
Ein XmlSchemaObject Wert, der die zu überprüfende Unterstruktur angibt.
- schemas
- XmlSchemaSet
Ein XmlSchemaSet , der überprüft werden soll.
- validationEventHandler
- ValidationEventHandler
A ValidationEventHandler für ein Ereignis, das auftritt, wenn der Leser Auf Gültigkeitsfehler auftritt. Wenn null, löst eine Ausnahme bei Überprüfungsfehlern aus.
- addSchemaInfo
- Boolean
Ein Boolean Wert, der angibt, ob das Infoset nach der Schemaüberprüfung (PSVI) aufgefüllt werden soll.
Ausnahmen
Wird für XSD-Überprüfungsfehler (XML Schema Definition Language) 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
Mit dieser Methode können Sie ü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önnten das gesamte Dokument überprüfen, aber es dauert weniger Verarbeitungszeit, um nur das Attribut zu überprüfen.
Ist addSchemaInfo dies der trueFall, füllt diese Methode das Attribut mit dem Infoset nach schema-validation (PSVI). Nachdem Sie die XML-Struktur mit der PSVI aufgefüllt haben, können Sie das überprüfte Attribut aufrufen Extensions.GetSchemaInfo . Dies ist nützlich, wenn Sie Code schreiben, der auf daten basiert, die von GetSchemaInfo.
Wenn Sie die Methode übergeben nullvalidationEventHandler, löst diese Methode bei Überprüfungsfehlern eine Ausnahme aus. Validierungswarnungen lösen keine Ausnahme aus.
Zum Überprüfen eines Attributs verwenden Sie eine Instanz von XmlSchemaObject. Sie können diese Instanz auf verschiedene Weise abrufen. Eine einfache Möglichkeit ist wie folgt:
Überprüfen Sie, ob ein Dokument einem Schema entspricht.
Fügen Sie das Infoset nach der Schemaüberprüfung (PSVI) hinzu, indem Sie die Validate Erweiterungsmethode aufrufen.
Rufen Sie die GetSchemaInfo Erweiterungsmethode auf, um ein Objekt abzurufen, das implementiert IXmlSchemaInfowird. Aus dem abgerufenen Objekt können Sie ein XmlSchemaObject.
Wenn Sie eine XmlSchemaObject für eine XElement, dies erhalten, lautet XmlSchemaElementder Typ .
Wenn Sie eine XmlSchemaObject für eine XAttribute, dies erhalten, lautet XmlSchemaAttributeder Typ .
Nachdem Sie über eine Instanz einer Instanz verfügen XmlSchemaObject, können Sie diese Methode verwenden, um ein Attribut zu überprüfen.
Gilt für:
Validate(XElement, XmlSchemaObject, XmlSchemaSet, ValidationEventHandler, Boolean)
Überprüft, ob eine XElement Unterstruktur einem angegebenen XmlSchemaObject und optionalen XmlSchemaSetAuffüllen der XML-Struktur mit dem Post-Schema-Validation-Infoset (PSVI) 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, 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 Wert, der die zu überprüfende Unterstruktur angibt.
- schemas
- XmlSchemaSet
Ein XmlSchemaSet , der überprüft werden soll.
- validationEventHandler
- ValidationEventHandler
A ValidationEventHandler für ein Ereignis, das auftritt, wenn der Leser Auf Gültigkeitsfehler auftritt. Wenn null, löst eine Ausnahme bei Überprüfungsfehlern aus.
- addSchemaInfo
- Boolean
Ein Boolean Wert, der angibt, ob das Infoset nach der Schemaüberprüfung (PSVI) aufgefüllt werden soll.
Ausnahmen
Wird für XSD-Überprüfungsfehler (XML Schema Definition Language) 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
Mit dieser Methode können Sie ü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 sicherstellen möchten, 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.
Ist addSchemaInfo dies trueder Fall, füllt diese Methode die XML-Struktur mit dem Infoset nach schema-validation (PSVI).
Es gibt zwei Aspekte des Auffüllens der XML-Struktur mit dem PSVI.
Zunächst wird allen Knoten in der Struktur eine Anmerkung 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 die Methode übergeben nullvalidationEventHandler, löst diese Methode bei Überprüfungsfehlern eine Ausnahme aus. Validierungswarnungen lösen keine Ausnahme aus.
Zum Überprüfen einer Unterstruktur verwenden Sie eine Instanz von XmlSchemaObject. Sie können diese Instanz auf verschiedene Weise abrufen. Eine einfache Möglichkeit ist wie folgt:
Überprüfen Sie, ob ein Dokument einem Schema entspricht.
Fügen Sie das Infoset nach der Schemaüberprüfung (PSVI) hinzu, indem Sie die Validate Erweiterungsmethode aufrufen.
Rufen Sie die GetSchemaInfo Erweiterungsmethode auf, um ein Objekt abzurufen, das implementiert IXmlSchemaInfowird. Aus dem abgerufenen Objekt können Sie ein XmlSchemaObject.
Wenn Sie eine XmlSchemaObject für eine XElement, dies erhalten, lautet XmlSchemaElementder Typ .
Wenn Sie eine XmlSchemaObject für eine XAttribute, dies erhalten, lautet XmlSchemaAttributeder Typ .
Nachdem Sie über eine Instanz einer XmlSchemaObjectDatei verfügen, können Sie diese Methode verwenden, um eine Unterstruktur zu überprüfen.