Toegang tot sterk getypte XML-gegevens met XPathNavigator
Als exemplaar van het XPath 2.0-gegevensmodel kan de XPathNavigator klasse sterk getypte gegevens bevatten die worden toegewezen aan CLR-typen (Common Language Runtime). Volgens het XPath 2.0-gegevensmodel kunnen alleen elementen en kenmerken sterk getypte gegevens bevatten. De XPathNavigator klasse biedt mechanismen voor toegang tot gegevens binnen een XPathDocument of XmlDocument object als sterk getypte gegevens, evenals mechanismen voor het converteren van het ene gegevenstype naar het andere.
Typegegevens weergegeven door XPathNavigator
XML 1.0-gegevens zijn technisch gezien zonder type, tenzij verwerkt met een DTD-, XSD-schema (XML Schema Definition Language) of een ander mechanisme. Er zijn een aantal categorieën van typegegevens die kunnen worden gekoppeld aan een XML-element of kenmerk.
Eenvoudige CLR-typen: Geen van de XML-schematalen bieden rechtstreeks ondersteuning voor CLR-typen (Common Language Runtime). Omdat het handig is om eenvoudige element- en kenmerkinhoud weer te geven als het meest geschikte CLR-type, kan alle eenvoudige inhoud worden getypt, zoals String bij afwezigheid van schemagegevens met eventuele toegevoegde schemagegevens die deze inhoud mogelijk verfijnen naar een geschikter type. U vindt het best overeenkomende CLR-type eenvoudige element- en kenmerkinhoud met behulp van de ValueType eigenschap. Zie Typeondersteuning in de System.Xml-klassen voor meer informatie over de toewijzing van ingebouwde schematypen aan CLR-typen.
Lijsten met CLR-typen (Simple): Een element of kenmerk met eenvoudige inhoud kan een lijst met waarden bevatten, gescheiden door witruimte. De waarden worden opgegeven door een XML-schema als 'lijsttype'. Als er geen XML-schema is, wordt dergelijke eenvoudige inhoud behandeld als één tekstknooppunt. Wanneer een XML-schema beschikbaar is, kan deze eenvoudige inhoud worden weergegeven als een reeks atomische waarden die elk een eenvoudig type hebben dat wordt toegewezen aan een verzameling CLR-objecten. Zie Typeondersteuning in de System.Xml-klassen voor meer informatie over de toewijzing van ingebouwde schematypen aan CLR-typen.
Getypte waarde: Een door een schema gevalideerd kenmerk of element met een eenvoudig type heeft een getypte waarde. Deze waarde is een primitief type, zoals een numeriek, tekenreeks of datumtype. Alle ingebouwde eenvoudige typen in XSD kunnen worden toegewezen aan CLR-typen die toegang bieden tot de waarde van een knooppunt als een geschikter type in plaats van alleen als een String. Een element met kenmerken of element onderliggende elementen wordt beschouwd als een complex type. De getypte waarde van een complex type met eenvoudige inhoud (alleen tekstknooppunten als onderliggende elementen) is hetzelfde als die van het eenvoudige type inhoud. De getypte waarde van een complex type met complexe inhoud (een of meer onderliggende elementen) is de tekenreekswaarde van de samenvoeging van alle onderliggende tekstknooppunten die als een String. Zie Typeondersteuning in de System.Xml-klassen voor meer informatie over de toewijzing van ingebouwde schematypen aan CLR-typen.
Specifieke typenaam voor schemataal: in de meeste gevallen worden de CLR-typen, die zijn ingesteld als een neveneffect van het toepassen van een extern schema, gebruikt om toegang te bieden tot de waarde van een knooppunt. Er kunnen echter situaties zijn waarin u het type wilt onderzoeken dat is gekoppeld aan een bepaald schema dat is toegepast op een XML-document. U kunt bijvoorbeeld zoeken in een XML-document, waarbij alle elementen worden geëxtraheerd die volgens een bijgevoegd schema inhoud van het type PurchaseOrder hebben. Dergelijke typegegevens kunnen alleen worden ingesteld als gevolg van schemavalidatie en deze informatie wordt geopend via de XmlType en SchemaInfo eigenschappen van de XPathNavigator klasse. Zie de sectie Post Schema Validation Infoset (PSVI) hieronder voor meer informatie.
Schemataalspecifieke typespiegeling: In andere gevallen wilt u mogelijk meer details verkrijgen van het schemaspecifieke type dat is toegepast op een XML-document. Als u bijvoorbeeld een XML-bestand leest, kunt u het
maxOccurs
kenmerk voor elk geldig knooppunt in het XML-document extraheren om een aangepaste berekening uit te voeren. Omdat deze informatie alleen wordt ingesteld via schemavalidatie, wordt deze toegankelijk via de SchemaInfo eigenschap van de XPathNavigator klasse. Zie de sectie Post Schema Validation Infoset (PSVI) hieronder voor meer informatie.
Getypte XPathNavigator-accessors
In de volgende tabel ziet u de verschillende eigenschappen en methoden van de XPathNavigator klasse die kunnen worden gebruikt voor toegang tot de typegegevens over een knooppunt.
Eigenschappen | Beschrijving |
---|---|
XmlType | Dit bevat de informatie over het XML-schematype voor het knooppunt als het geldig is. |
SchemaInfo | Dit bevat de Post Schema Validation Infoset van het knooppunt dat na de validatie wordt toegevoegd. Dit omvat de informatie over het XML-schematype en de geldigheidsgegevens. |
ValueType | Het CLR-type van de getypte waarde van het knooppunt. |
TypedValue | De inhoud van het knooppunt als een of meer CLR-waarden waarvan het type het dichtst overeenkomt met het XML-schematype van het knooppunt. |
ValueAsBoolean | De String waarde van de huidige knooppuntcast naar een Boolean waarde, volgens de XPath 2.0-castregels voor xs:boolean . |
ValueAsDateTime | De String waarde van de huidige knooppuntcast naar een DateTime waarde, volgens de XPath 2.0-castregels voor xs:datetime . |
ValueAsDouble | De String waarde van de huidige knooppuntcast naar een Double waarde, volgens de XPath 2.0-castregels voor xsd:double . |
ValueAsInt | De String waarde van de huidige knooppuntcast naar een Int32 waarde, volgens de XPath 2.0-castregels voor xs:integer . |
ValueAsLong | De String waarde van de huidige knooppuntcast naar een Int64 waarde, volgens de XPath 2.0-castregels voor xs:integer . |
ValueAs | De inhoud van het knooppunt wordt naar het doeltype gecast volgens de regels voor het casten van XPath 2.0. |
Zie Typeondersteuning in de System.Xml-klassen voor meer informatie over de toewijzing van ingebouwde schematypen aan CLR-typen.
De Post Schema Validation Infoset (PSVI)
Een XML-schemaprocessor accepteert een XML-infoset als invoer en converteert deze naar een Post Schema Validation Infoset (PSVI). Een PSVI is de oorspronkelijke XML-invoergegevensset met nieuwe informatie-items toegevoegd en nieuwe eigenschappen toegevoegd aan bestaande informatie-items. Er zijn drie brede informatieklassen toegevoegd aan de XML-infoset in de PSVI die worden weergegeven door de XPathNavigator.
Validatieresultaten: informatie over of een element of kenmerk is gevalideerd of niet. Dit wordt weergegeven door de Validity eigenschap van de SchemaInfo eigenschap van de XPathNavigator klasse.
Standaardinformatie: Geeft aan of de waarde van het element of kenmerk is verkregen via standaardwaarden die zijn opgegeven in het schema of niet. Dit wordt weergegeven door de IsDefault eigenschap van de SchemaInfo eigenschap van de XPathNavigator klasse.
Type aantekeningen: verwijzingen naar schemaonderdelen die kunnen typedefinities of element- en kenmerkdeclaraties zijn. De XmlType eigenschap van het XPathNavigator bestand bevat de specifieke typegegevens van het knooppunt als het geldig is. Als de geldigheid van een knooppunt onbekend is, bijvoorbeeld wanneer het is gevalideerd, is het vervolgens bewerkt. vervolgens is de XmlType eigenschap ingesteld op
null
maar typegegevens zijn nog steeds beschikbaar vanuit de verschillende eigenschappen van de SchemaInfo eigenschap van de XPathNavigator klasse.
Het volgende voorbeeld illustreert het gebruik van informatie in de Post Schema Validation Infoset die wordt weergegeven door de XPathNavigator.
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 het voorbeeld wordt het books.xml
bestand als invoer gebruikt.
<books xmlns="http://www.contoso.com/books">
<book>
<title>Title</title>
<price>10.00</price>
<published>2003-12-31</published>
</book>
</books>
In het voorbeeld wordt het books.xsd
schema ook als invoer gebruikt.
<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>
Getypte waarden verkrijgen met valueAs-eigenschappen
De getypte waarde van een knooppunt kan worden opgehaald door toegang te krijgen tot de TypedValue eigenschap van de XPathNavigator. In bepaalde gevallen kunt u de getypte waarde van een knooppunt converteren naar een ander type. Een veelvoorkomend voorbeeld is het ophalen van een numerieke waarde van een XML-knooppunt. Denk bijvoorbeeld aan het volgende niet-gevalideerde en niet-getypte XML-document.
<books>
<book>
<title>Title</title>
<price>10.00</price>
<published>2003-12-31</published>
</book>
</books>
Als de XPathNavigator eigenschap op het price
element XmlType wordt weergegeven, zou null
de ValueType eigenschap zijn Stringen de eigenschap de TypedValue tekenreeks 10.00
.
Het is echter nog steeds mogelijk om de waarde te extraheren als een numerieke waarde met behulp van de ValueAs, ValueAsDouble, ValueAsIntof ValueAsLong methode en eigenschappen. In het volgende voorbeeld ziet u hoe u een dergelijke cast uitvoert met behulp van de ValueAs methode.
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));
Zie Typeondersteuning in de System.Xml-klassen voor meer informatie over de toewijzing van ingebouwde schematypen aan CLR-typen.
Zie ook
- XmlDocument
- XPathDocument
- XPathNavigator
- Typ ondersteuning in de System.XML-klassen
- XML-gegevens verwerken met behulp van het XPath-gegevensmodel
- Navigatie knooppunten instellen met XPathNavigator
- Kenmerk- en naamruimteknooppuntnavigatie met behulp van XPathNavigator
- XML-gegevens extraheren met XPathNavigator