Partager via


Accès aux données XML fortement typées à l’aide de XPathNavigator

En tant qu’instance du modèle de données XPath 2.0, la XPathNavigator classe peut contenir des données fortement typées qui correspondent aux types CLR (Common Language Runtime). Selon le modèle de données XPath 2.0, seuls les éléments et attributs peuvent contenir des données fortement typées. La XPathNavigator classe fournit des mécanismes permettant d'accéder aux données à l'intérieur d'un XPathDocument ou d'un XmlDocument objet en tant que données fortement typées, ainsi que des mécanismes pour convertir d'un type de données à un autre.

Informations de type exposées par XPathNavigator

Les données XML 1.0 sont techniquement sans type, sauf si elles sont traitées avec un schéma XSD (Xml Schema Definition Language) ou un autre mécanisme. Il existe plusieurs catégories d’informations de type qui peuvent être associées à un élément ou un attribut XML.

  • Types CLR simples : aucun des langages de schéma XML ne prend en charge les types CLR (Common Language Runtime) directement. Étant donné qu’il est utile d’afficher du contenu d’élément et d’attribut simple comme type CLR le plus approprié, tout le contenu simple peut être tapé comme String en l’absence d’informations de schéma avec des informations de schéma ajoutées susceptibles d’affiner ce contenu en un type plus approprié. La propriété ValueType permet de trouver le type CLR le plus adapté à un contenu d'attribut ou d'élément simple. Pour plus d’informations sur le mappage entre les types intégrés de schéma et les types CLR, consultez La prise en charge des types dans les classes System.Xml.

  • Listes de types simples (CLR) : un élément ou un attribut avec du contenu simple peut contenir une liste de valeurs séparées par des espaces blancs. Les valeurs sont spécifiées par un schéma XML pour être un « type de liste ». En l’absence d’un schéma XML, un tel contenu simple serait traité comme un nœud de texte unique. Lorsqu’un schéma XML est disponible, ce contenu simple peut être exposé sous la forme d’une série de valeurs atomiques qui ont chacun un type simple mappé à une collection d’objets CLR. Pour plus d’informations sur le mappage entre les types intégrés de schéma et les types CLR, consultez La prise en charge des types dans les classes System.Xml.

  • Valeur typée : un attribut ou un élément validé par un schéma avec un type simple a une valeur typée. Cette valeur est un type primitif tel qu’un type numérique, chaîne ou date. Tous les types simples intégrés dans XSD peuvent être mappés à des types CLR qui fournissent l’accès à la valeur d’un nœud en tant que type plus approprié au lieu d’un String. Un élément avec des attributs ou des éléments enfants est considéré comme un type complexe. La valeur typée d'un type complexe avec un contenu simple (uniquement des nœuds de texte comme enfants) est identique à celui du type simple de son contenu. La valeur typée d'un type complexe avec un contenu complexe (un ou plusieurs éléments enfants) est la valeur de chaîne de la concaténation de tous ses nœuds de texte enfant retournée sous la forme d'un objet String. Pour plus d’informations sur le mappage entre les types intégrés de schéma et les types CLR, consultez La prise en charge des types dans les classes System.Xml.

  • Schema-Language nom de type spécifique : dans la plupart des cas, les types CLR, qui sont définis comme un effet secondaire de l’application d’un schéma externe, sont utilisés pour fournir l’accès à la valeur d’un nœud. Toutefois, il peut arriver que vous souhaitiez examiner le type associé à un schéma particulier appliqué à un document XML. Par exemple, vous souhaiterez peut-être effectuer une recherche dans un document XML, en extrayant tous les éléments déterminés à avoir du contenu de type « PurchaseOrder » en fonction d’un schéma attaché. Ces informations de type ne peuvent être définies qu’à la suite de la validation du schéma et ces informations sont accessibles via les XmlType et SchemaInfo propriétés de la XPathNavigator classe. Pour plus d’informations, consultez la section Post Schema Validation Infoset (PSVI) ci-dessous.

  • Schema-Language Réflexion sur un type spécifique : dans d’autres cas, vous souhaiterez peut-être obtenir des détails supplémentaires sur le type défini par le schéma appliqué à un document XML. Par exemple, lors de la lecture d’un fichier XML, vous pouvez extraire l’attribut maxOccurs de chaque nœud valide dans le document XML afin d’effectuer un calcul personnalisé. Étant donné que ces informations sont définies uniquement via la validation de schéma, elles sont accessibles via la SchemaInfo propriété de la XPathNavigator classe. Pour plus d’informations, consultez la section Post Schema Validation Infoset (PSVI) ci-dessous.

Accesseurs typés XPathNavigator

Le tableau suivant présente les différentes propriétés et méthodes de la XPathNavigator classe qui peuvent être utilisées pour accéder aux informations de type sur un nœud.

Propriété Descriptif
XmlType Il contient les informations de type de schéma XML pour le nœud s’il est valide.
SchemaInfo Il contient l’ensemble d’informations post-validation du schéma du nœud ajouté après la validation. Cela inclut les informations de type de schéma XML, ainsi que les informations de validité.
ValueType Type CLR de la valeur typée du nœud.
TypedValue Contenu du nœud sous la forme d’une ou plusieurs valeurs CLR dont le type correspond le plus proche au type de schéma XML du nœud.
ValueAsBoolean La valeur String du nœud actuel convertie en valeur Boolean, conformément aux règles de conversion XPath 2.0 pour xs:boolean.
ValueAsDateTime La valeur String du nœud actuel convertie en valeur DateTime, conformément aux règles de conversion XPath 2.0 pour xs:datetime.
ValueAsDouble La valeur String du nœud actuel convertie en valeur Double, conformément aux règles de conversion XPath 2.0 pour xsd:double.
ValueAsInt La valeur String du nœud actuel convertie en valeur Int32, conformément aux règles de conversion XPath 2.0 pour xs:integer.
ValueAsLong La valeur String du nœud actuel convertie en valeur Int64, conformément aux règles de conversion XPath 2.0 pour xs:integer.
ValueAs Contenu du nœud cast en type cible conformément aux règles de conversion de XPath 2.0.

Pour plus d’informations sur le mappage entre les types intégrés de schéma et les types CLR, consultez La prise en charge des types dans les classes System.Xml.

Jeu d'informations de post-validation de schéma (PSVI)

Un processeur de schémas XML accepte un ensemble d’informations XML comme entrée et le convertit en un ensemble d’informations de validation de schéma (PSVI). Un PSVI est l’ensemble d’informations XML d’entrée d’origine avec de nouveaux éléments d’informations ajoutés et de nouvelles propriétés ajoutées aux éléments d’informations existants. Il existe trois grandes classes d’informations ajoutées à l’ensemble d’informations XML dans psVI qui sont exposées par le XPathNavigator.

  1. Résultats de la validation : informations sur la validation ou non d’un élément ou d’un attribut. Ceci est exposé par la propriété Validity de la propriété SchemaInfo de la classe XPathNavigator.

  2. Informations par défaut : indications indiquant si la valeur de l’élément ou de l’attribut a été obtenue via des valeurs par défaut spécifiées dans le schéma ou non. Ceci est exposé par la propriété IsDefault de la propriété SchemaInfo de la classe XPathNavigator.

  3. Annotations de type : références aux composants de schéma qui peuvent être des définitions de type ou des déclarations d’élément et d’attribut. La propriété XmlType du XPathNavigator contient les informations spécifiques de type du nœud si celui-ci est valide. Si la validité d’un nœud est inconnue, par exemple quand elle a été validée, puis modifiée par la suite. la XmlType propriété est alors définie sur null mais les informations de type sont toujours disponibles à partir des différentes propriétés de la SchemaInfo propriété de la XPathNavigator classe.

L’exemple suivant illustre l’utilisation des informations dans le jeu d’informations de post-validation de schéma exposé par l’objet 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);  

L’exemple prend le fichier books.xml comme entrée.

<books xmlns="http://www.contoso.com/books">  
    <book>  
        <title>Title</title>  
        <price>10.00</price>  
        <published>2003-12-31</published>  
    </book>  
</books>  

L’exemple prend également le books.xsd schéma comme entrée.

<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>  

Obtenir des valeurs typées à l’aide des propriétés ValueAs

La valeur typée d’un nœud peut être récupérée en accédant à la TypedValue propriété du XPathNavigator. Dans certains cas, vous pouvez convertir la valeur typée d’un nœud en un autre type. Un exemple courant consiste à obtenir une valeur numérique à partir d’un nœud XML. Par exemple, considérez le document XML non validé et non typé suivant.

<books>  
    <book>  
        <title>Title</title>  
        <price>10.00</price>  
        <published>2003-12-31</published>  
    </book>  
</books>  

Step 2: Si l’élément XPathNavigator est positionné sur l’élément price, la propriété XmlType serait null, la propriété ValueType serait String, et la propriété TypedValue serait la chaîne 10.00.

Toutefois, il est toujours possible d’extraire la valeur sous la forme d’une valeur numérique à l’aide des méthodes et des propriétés ValueAs, ValueAsDouble, ValueAsInt, ou ValueAsLong. L'exemple suivant illustre l'exécution de ce type de conversion à l'aide de la méthode ValueAs.

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));  

Pour plus d’informations sur le mappage entre les types intégrés de schéma et les types CLR, consultez La prise en charge des types dans les classes System.Xml.

Voir aussi