Zugreifen auf streng typisierte XML-Daten mit 'XPathNavigator'
Als Instanz des XPath 2.0-Datenmodells kann die XPathNavigator-Klasse stark typisierte Daten enthalten, die den CLR-Typen (Common Language Runtime) zugeordnet werden. Gemäß des XPath 2.0-Datenmodells können nur Elemente und Attribute stark typisierte Daten enthalten. Die XPathNavigator-Klasse stellt Mechanismen zum Zugreifen auf Daten in einem XPathDocument-Objekt oder einem XmlDocument-Objekt als stark typisierte Daten sowie Mechanismen zum Konvertieren von einem Datentyp in einen anderen bereit.
Von XPathNavigator verfügbar gemachte Typinformationen
XML 1.0-Daten weisen im Allgemeinen keinen Typ auf, es sei denn, sie wurden mit einer DTD, einem XSD-Schema (XML Schema Definition Language) oder anderen Mechanismen verarbeitet. Es gibt verschiedene Kategorien von Typinformationen, die einem XML-Element oder XML-Attribut zugeordnet werden können.
Einfache CLR-Typen: Keine der XML-Schemasprachen unterstützt CLR-Typen (Common Language Runtime) direkt. Da das Anzeigen des Inhalts von einfachen Elementen und Attributen im am besten geeigneten CLR-Typ hilfreich ist, können alle einfachen Inhalte als String mit allen hinzugefügten Schemainformationen typisiert werden, die den Inhalt möglicherweise einem besser geeigneten Typ anpassen, ohne dass Schemainformationen vorhanden sind. Mithilfe der ValueType-Eigenschaft können Sie den am besten geeigneten CLR-Typ des Inhalts von einfachen Elementen und Attributen ermitteln. Weitere Informationen zum Zuordnen von integrierten Schematypen zu CLR-Typen finden Sie unter Typenunterstützung in den System.Xml-Klassen.
Liste der einfachen (CLR-)Typen: Ein Element oder Attribut mit einfachem Inhalt kann eine Liste mit Werten enthalten, die durch ein Leerzeichen voneinander getrennt sind. Die Werte werden durch ein XML-Schema als „Listentyp“ angegeben. Wenn kein XML-Schema vorhanden ist, werden solche einfachen Inhalte als einzelner Textknoten behandelt. Wenn ein XML-Schema verfügbar ist, kann dieser einfache Inhalt als eine Serie von atomaren Werten verfügbar gemacht werden, die alle einen einfachen Typ aufweisen, der einer Auflistung von CLR-Objekten zugeordnet ist. Weitere Informationen zum Zuordnen von integrierten Schematypen zu CLR-Typen finden Sie unter Typenunterstützung in den System.Xml-Klassen.
Typisierter Wert: Ein für ein Schema validiertes Attribut oder Element mit einem einfachen Typ weist einen typisierten Wert auf. Dieser Wert ist ein primitiver Typ, z. B. ein numerischer Typ, ein Zeichenfolgentyp oder ein Datentyp. Alle integrierten einfachen Typen in XSD können CLR-Typen zugeordnet werden, die Zugriff auf den Wert eines Knotens als einen besser geeigneten Typ anstatt nur als einen String bereitstellen. Ein Element mit Attributen oder untergeordneten Elementen wird als komplexer Typ betrachtet. Der typisierte Wert eines komplexen Typs mit einfachem Inhalt (nur Textknoten als untergeordnete Elemente) ist der gleiche wie der Wert des einfachen Typs dieses Inhalts. Der typisierte Wert eines komplexen Typs mit komplexem Inhalt (ein oder mehr untergeordnete Elemente) ist der Zeichenfolgenwert der Verkettung aller untergeordneten Textknoten, die als ein String zurückgegeben werden. Weitere Informationen zum Zuordnen von integrierten Schematypen zu CLR-Typen finden Sie unter Typenunterstützung in den System.Xml-Klassen.
Schemasprachenspezifischer Typname: In den meisten Fällen werden die CLR-Typen, die als Nebeneffekt beim Übernehmen eines externen Schemas festgelegt werden, zum Bereitstellen des Zugriffs auf den Wert eines Knotens verwendet. In manchen Situationen ist es jedoch empfehlenswert, den Typ zu überprüfen, der einem bestimmten auf ein XML-Dokument angewendeten Schema zugeordnet ist. Zum Beispiel möchten Sie möglicherweise ein XML-Dokument durchsuchen und dabei alle Elemente extrahieren, die Inhalt vom Typ "PurchaseOrder" gemäß eines zugewiesenen Schemas aufweisen. Diese Typinformationen können nur durch Schemavalidierung festgelegt werden. Auf diese Informationen wird über die XmlType-Eigenschaft und die SchemaInfo-Eigenschaft der XPathNavigator-Klasse zugegriffen. Weitere Informationen finden Sie im Abschnitt „Das Post-Schema-Validation-Infoset (PSVI)“ weiter unten.
Schemasprachenspezifische Typreflektion: In anderen Fällen sollten Sie nähere Informationen zum schemaspezifischen Typ abrufen, der auf ein XML-Dokument angewendet wird. Zum Beispiel möchten Sie eventuell beim Lesen einer XML-Datei die
maxOccurs
-Attribute aller gültigen Knoten im XML-Dokument extrahieren, um eine benutzerdefinierte Berechnung durchzuführen. Da diese Informationen nur durch Schemavalidierung festgelegt wird, wird darauf über die SchemaInfo-Eigenschaft der XPathNavigator-Klasse zugegriffen. Weitere Informationen finden Sie im Abschnitt „Das Post-Schema-Validation-Infoset (PSVI)“ weiter unten.
Mit "XPathNavigator" typisierte Accessoren
Die folgenden Tabelle enthält die verschiedenen Eigenschaften und Methoden der XPathNavigator-Klasse, mit denen auf die Typinformationen eines Knotens zugegriffen werden kann.
Eigenschaft | Beschreibung |
---|---|
XmlType | Dieses Objekt enthält die XML-Schematypinformationen des Knotens, sofern dieser gültig ist. |
SchemaInfo | Dieses Objekt enthält das Post-Schema-Validation-Infoset des Knotens, der nach der Validierung hinzugefügt wird. Darin sind die XML-Schematypinformationen sowie die Gültigkeitsinformationen eingeschlossen. |
ValueType | Der CLR-Typ des typisierten Werts des Knotens. |
TypedValue | Der Inhalt des Knotens als mindestens ein CLR-Wert, dessen Typ am ehesten dem XML-Schematyp des Knotens entspricht. |
ValueAsBoolean | Der String-Wert des aktuellen Knotens, gemäß der Umwandlungsregeln für XPath 2.0 für Boolean in einen xs:boolean -Wert umgewandelt. |
ValueAsDateTime | Der String-Wert des aktuellen Knotens, gemäß der Umwandlungsregeln für XPath 2.0 für DateTime in einen xs:datetime -Wert umgewandelt. |
ValueAsDouble | Der String-Wert des aktuellen Knotens, gemäß der Umwandlungsregeln für XPath 2.0 für Double in einen xsd:double -Wert umgewandelt. |
ValueAsInt | Der String-Wert des aktuellen Knotens, gemäß der Umwandlungsregeln für XPath 2.0 für Int32 in einen xs:integer -Wert umgewandelt. |
ValueAsLong | Der String-Wert des aktuellen Knotens, gemäß der Umwandlungsregeln für XPath 2.0 für Int64 in einen xs:integer -Wert umgewandelt. |
ValueAs | Der Inhalt des Knotens, gemäß der Umwandlungsregeln für XPath 2.0 in den Zieltyp umgewandelt. |
Weitere Informationen zum Zuordnen von integrierten Schematypen zu CLR-Typen finden Sie unter Typenunterstützung in den System.Xml-Klassen.
Das Post-Schema-Validation-Infoset (PSVI)
Ein XML-Schemaprozessor akzeptiert ein XML-Infoset als Eingabe und konvertiert es in ein Post-Schema-Validation-Infoset (PSVI). Ein PSVI stellt das ursprüngliche Eingabe-XML-Infoset dar, dem neue Informationselemente hinzugefügt wurden. Vorhandenen Informationselementen wurden neue Eigenschaften hinzugefügt. Es gibt drei komplexe Klassen von Informationen, die dem XML-Infoset im PSVI hinzugefügt wurden und vom XPathNavigator verfügbar gemacht werden.
Validierungsergebnisse: Informationen dazu, ob ein Element oder ein Attribut erfolgreich validiert wurde. Diese werden von der Validity-Eigenschaft der SchemaInfo-Eigenschaft der XPathNavigator-Klasse verfügbar gemacht.
Standardinformationen: Angaben dazu, ob der Wert des Elements oder des Attributs über im Schema angegebene Standardwerte abgerufen wurde. Diese werden von der IsDefault-Eigenschaft der SchemaInfo-Eigenschaft der XPathNavigator-Klasse verfügbar gemacht.
Typanmerkungen: Verweise auf Schemakomponenten, die möglicherweise Typdefinitionen oder Element- und Attributdeklarationen sind. Die XmlType-Eigenschaft von XPathNavigator enthält die bestimmten Typinformationen des Knotens, sofern dieser gültig ist. Wenn die Gültigkeit eines Knotens unbekannt ist, das heißt, er wurde überprüft und anschließend bearbeitet. dann wird die XmlType-Eigenschaft auf
null
festgelegt, wobei die Typinformationen jedoch weiterhin in den verschiedenen Eigenschaften der SchemaInfo-Eigenschaft der XPathNavigator-Klasse verfügbar sind.
Im folgenden Beispiel wird das Verwenden der Informationen im Post-Schema-Validation-Infoset veranschaulicht, die von XPathNavigator verfügbar gemacht wurden.
Dim settings As XmlReaderSettings = New XmlReaderSettings()
settings.Schemas.Add("http://www.contoso.com/books", "books.xsd")
settings.ValidationType = ValidationType.Schema
Dim reader As XmlReader = XmlReader.Create("books.xml", settings)
Dim document As XmlDocument = New XmlDocument()
document.Load(reader)
Dim navigator As XPathNavigator = document.CreateNavigator()
navigator.MoveToChild("books", "http://www.contoso.com/books")
navigator.MoveToChild("book", "http://www.contoso.com/books")
navigator.MoveToChild("published", "http://www.contoso.com/books")
Console.WriteLine(navigator.SchemaInfo.SchemaType.Name)
Console.WriteLine(navigator.SchemaInfo.Validity)
Console.WriteLine(navigator.SchemaInfo.SchemaElement.MinOccurs)
XmlReaderSettings settings = new XmlReaderSettings();
settings.Schemas.Add("http://www.contoso.com/books", "books.xsd");
settings.ValidationType = ValidationType.Schema;
XmlReader reader = XmlReader.Create("books.xml", settings);
XmlDocument document = new XmlDocument();
document.Load(reader);
XPathNavigator navigator = document.CreateNavigator();
navigator.MoveToChild("books", "http://www.contoso.com/books");
navigator.MoveToChild("book", "http://www.contoso.com/books");
navigator.MoveToChild("published", "http://www.contoso.com/books");
Console.WriteLine(navigator.SchemaInfo.SchemaType.Name);
Console.WriteLine(navigator.SchemaInfo.Validity);
Console.WriteLine(navigator.SchemaInfo.SchemaElement.MinOccurs);
In diesem Beispiel wird die Datei books.xml
als Eingabe verwendet.
<books xmlns="http://www.contoso.com/books">
<book>
<title>Title</title>
<price>10.00</price>
<published>2003-12-31</published>
</book>
</books>
In diesem Beispiel wird auch das books.xsd
-Schema als Eingabe verwendet.
<xs:schema xmlns="http://www.contoso.com/books"
attributeFormDefault="unqualified" elementFormDefault="qualified"
targetNamespace="http://www.contoso.com/books"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="publishedType">
<xs:restriction base="xs:date">
<xs:minInclusive value="2003-01-01" />
<xs:maxInclusive value="2003-12-31" />
</xs:restriction>
</xs:simpleType>
<xs:complexType name="bookType">
<xs:sequence>
<xs:element name="title" type="xs:string"/>
<xs:element name="price" type="xs:decimal"/>
<xs:element name="published" type="publishedType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="booksType">
<xs:sequence>
<xs:element name="book" type="bookType" />
</xs:sequence>
</xs:complexType>
<xs:element name="books" type="booksType" />
</xs:schema>
Abrufen von typisierten Werten mithilfe von ValueAs-Eigenschaften
Der typisierte Wert eines Knotens kann durch Zugreifen auf die TypedValue-Eigenschaft von XPathNavigator abgerufen werden. In bestimmten Fällen soll der typisierte Wert eines Knotens möglicherweise in einen anderen Typ konvertiert werden. Ein häufig verwendetes Beispiel ist das Abrufen eines numerischen Werts aus einem XML-Knoten. Betrachten Sie z. B. das folgende nicht validierte und nicht typisierte XML-Dokument.
<books>
<book>
<title>Title</title>
<price>10.00</price>
<published>2003-12-31</published>
</book>
</books>
Wenn XPathNavigator auf dem price
-Element positioniert wird, ist die XmlType-Eigenschaft null
, die ValueType-Eigenschaft ist String und die TypedValue-Eigenschaft entspricht der Zeichenfolge 10.00
.
Es ist jedoch trotzdem möglich, den Wert mithilfe der Methoden und Eigenschaften ValueAs, ValueAsDouble, ValueAsInt und ValueAsLong als einen numerischen Wert zu extrahieren. Im folgenden Beispiel wird das Durchführen einer solchen Umwandlung mithilfe der ValueAs-Methode veranschaulicht.
Dim document As New XmlDocument()
document.Load("books.xml")
Dim navigator As XPathNavigator = document.CreateNavigator()
navigator.MoveToChild("books", "")
navigator.MoveToChild("book", "")
navigator.MoveToChild("price", "")
Dim price = navigator.ValueAs(GetType(Decimal))
Dim discount As Decimal = 0.2
Console.WriteLine("The price of the book has been dropped 20% from {0:C} to {1:C}", navigator.Value, (price - price * discount))
XmlDocument document = new XmlDocument();
document.Load("books.xml");
XPathNavigator navigator = document.CreateNavigator();
navigator.MoveToChild("books", "");
navigator.MoveToChild("book", "");
navigator.MoveToChild("price", "");
Decimal price = (decimal)navigator.ValueAs(typeof(decimal));
Console.WriteLine("The price of the book has been dropped 20% from {0:C} to {1:C}", navigator.Value, (price - price * (decimal)0.20));
Weitere Informationen zum Zuordnen von integrierten Schematypen zu CLR-Typen finden Sie unter Typenunterstützung in den System.Xml-Klassen.
Siehe auch
- XmlDocument
- XPathDocument
- XPathNavigator
- Type Support in the System.Xml Classes (Typenunterstützung in den System.Xml-Klassen)
- Verarbeiten von XML-Daten mithilfe des XPath-Datenmodells
- Navigieren in Knotengruppen mit XPathNavigator
- Das Navigieren durch Attribut- und Namespaceknoten mit XPathNavigator
- Extrahieren von XML-Daten mit XPathNavigator