Partager via


Accès à des données XML fortement typées à l'aide de XPathNavigator

En tant qu'instance du modèle de données XPath 2.0, la classe XPathNavigator peut contenir des données fortement typées correspondant aux types CLR (Common Language Runtime) courants. Conformément au modèle de données XPath 2.0, seuls les éléments et les attributs peuvent contenir des données fortement typées. La classe XPathNavigator offre des mécanismes d'accès aux données dans un objet XPathDocument ou XmlDocument sous la forme de données fortement typées et des mécanismes de conversion d'un type de données en un autre.

Informations sur le type exposées par XPathNavigator

D'un point de vue technique, les données XML 1.0 ne présentent pas de type, sauf si elles sont traitées avec une DTD, un schéma de langage XSD (XML schema definition) ou un autre mécanisme. Un certain nombre de catégories d'informations sur le type peuvent être associées à un attribut ou un élément XML.

  • Types CLR simples : aucun des langages de schéma XML ne prend directement en charge les types CLR (Common Language Runtime). Puisqu'il est utile de pouvoir afficher du contenu d'attribut ou d'élément simple en tant que type CLR le plus approprié, tout contenu simple peut être typé String en l'absence d'informations de schéma avec des informations complémentaires sur le schéma qui redéfinissent potentiellement ce contenu en 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 de types de schéma intégrés à des types CLR, consultez Prise en charge du type dans les classes System.Xml.

  • Listes de types (CLR) simples : 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 comme « type de liste ». En l'absence d'un schéma XML, un tel contenu simple est traité comme un nœud de texte simple. Si un schéma XML est disponible, ce contenu simple peut être exposé comme une série de valeurs atomiques ayant chacune un type simple qui correspond à un ensemble d'objets CLR. Pour plus d'informations sur le mappage de types de schéma intégrés à des types CLR, consultez Prise en charge du type dans les classes System.Xml.

  • Valeur typée : élément ou attribut validé par rapport à un schéma avec un type simple qui présente une valeur typée. Cette valeur est un type primitif tel qu'un type numérique, de chaîne ou de date. Tous les types intégrés simples de XSD peuvent être mappés à des types CLR fournissant un accès à la valeur d'un nœud en tant que type le plus approprié, au lieu d'un simple objet 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 de types de schéma intégrés à des types CLR, consultez Prise en charge du type dans les classes System.Xml.

  • Nom du type spécifique au langage du schéma : dans la plupart des cas, les types CLR, définis comme l'effet secondaire de l'application d'un schéma externe, permettent de fournir un accès à la valeur d'un nœud. Toutefois, dans certaines situations, il se peut que vous souhaitiez examiner le type associé à un schéma particulier appliqué à un document XML. Par exemple, il se peut que vous souhaitiez effectuer une recherche dans un document XML et extraire tous les éléments identifiés comme ayant un contenu de type « OrdreAchat » conformément à un schéma associé. Ces informations sur le type ne peuvent être définies que suite à une validation de schéma et sont accessibles via les propriétés XmlType et SchemaInfo de la classe XPathNavigator. Pour plus d'informations, consultez la section ci-dessous sur le jeu d'informations de post-validation de schéma (PSVI).

  • Réflexion du type spécifique au langage du schéma : dans d'autres cas, il se peut que vous souhaitiez obtenir d'autres détails sur le type spécifique au schéma appliqué à un document XML. Par exemple, lors de la lecture d'un fichier XML; il se peut que vous souhaitiez extraire l'attribut maxOccurs pour chaque nœud valide du document XML pour effectuer certains calculs personnalisés. Étant donné que ces informations ne sont définies que via la validation de schéma, elles sont accessibles par le biais de la propriété SchemaInfo de la classe XPathNavigator. Pour plus d'informations, consultez la section ci-dessous sur le jeu d'informations de post-validation de schéma (PSVI).

Accesseurs typés XPathNavigator

Le tableau suivant illustre les différentes propriétés et méthodes de la classe XPathNavigator pouvant être utilisées pour accéder aux informations sur le type à propos d'un nœud.

Propriété

Description

XmlType

Contient les informations sur le type de schéma XML pour le nœud s'il est valide.

SchemaInfo

Contient le jeu d'informations de post-validation de schéma du nœud ajouté après validation, notamment les informations sur le type de schéma XML et sur la validité.

ValueType

Type CLR de la valeur typée du nœud.

TypedValue

Contenu du nœud si au moins une valeur CLR du type correspondant le plus au type de schéma XML du nœud.

ValueAsBoolean

Valeur String du nœud actuel cast en valeur Boolean conformément aux règles de conversion de XPath 2.0 pour xs:boolean.

ValueAsDateTime

Valeur String du nœud actuel cast en valeur DateTime conformément aux règles de conversion de XPath 2.0 pour xs:datetime.

ValueAsDouble

Valeur String du nœud actuel cast en valeur Double conformément aux règles de conversion de XPath 2.0 pour xsd:double.

ValueAsInt

Valeur String du nœud actuel cast en valeur Int32 conformément aux règles de conversion de XPath 2.0 pour xs:integer.

ValueAsLong

Valeur String du nœud actuel cast en valeur Int64 conformément aux règles de conversion de 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 de types de schéma intégrés à des types CLR, consultez Prise en charge du type dans les classes System.Xml.

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

Un processeur de schéma XML accepte un jeu d'informations XML et le convertit en jeu d'informations de post-validation de schéma (PSVI). Un PSVI est le jeu d'informations XML d'entrée original auquel sont ajoutés les nouveaux éléments d'informations et les nouvelles propriétés, elles-mêmes ajoutées aux éléments d'informations existants. Trois grandes classes d'informations sont ajoutées au jeu d'informations XML du PSVI exposé par l'objet XPathNavigator.

  1. Résultats de validation : informations indiquant si un élément ou un attribut a été correctement validé ou non. Ces informations sont exposées par la propriété Validity de la propriété SchemaInfo de la classe XPathNavigator.

  2. Informations par défaut : indiquent 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. Ces informations sont exposées 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 pouvant être des définitions de types ou des déclarations d'élément et d'attribut. La propriété XmlType de l'objet XPathNavigator contient les informations spécifiques sur le type du nœud s'il est valide. Si la validité d'un nœud est inconnue, par exemple s'il a été validé, puis modifié, la propriété XmlType est définie sur null, mais les informations sur le type sont toujours disponibles à partir des différentes propriétés de la propriété SchemaInfo de la classe XPathNavigator.

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("https://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", "https://www.contoso.com/books")
navigator.MoveToChild("book", "https://www.contoso.com/books")
navigator.MoveToChild("published", "https://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("https://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", "https://www.contoso.com/books");
navigator.MoveToChild("book", "https://www.contoso.com/books");
navigator.MoveToChild("published", "https://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="https://www.contoso.com/books">
    <book>
        <title>Title</title>
        <price>10.00</price>
        <published>2003-12-31</published>
    </book>
</books>

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

<xs:schema xmlns="https://www.contoso.com/books" 
attributeFormDefault="unqualified" elementFormDefault="qualified" 
targetNamespace="https://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>

Obtention de valeurs typées à l'aide des propriétés ValueAs

Vous pouvez récupérer la valeur typée d'un nœud en accédant à la propriété TypedValue de l'objet XPathNavigator. Dans certains cas, il se peut que vous souhaitiez convertir la valeur typée d'un nœud en un type différent. Un exemple courant consiste à obtenir une valeur numérique à partir d'un nœud XML. Considérez par exemple le document XML non typé et non validé suivant.

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

Si l'objet XPathNavigator est positionné sur l'élément price, la propriété XmlType serait null, la propriété ValueType serait l'objet 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 propriétés et de la méthode 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 de types de schéma intégrés à des types CLR, consultez Prise en charge du type dans les classes System.Xml.

Voir aussi

Référence

XmlDocument

XPathDocument

XPathNavigator

Concepts

Traitement des données XML à l'aide du modèle de données XPath

Navigation dans la collection de nœuds à l'aide de XPathNavigator

Navigation entre les nœuds d'attribut et d'espace de noms à l'aide de XPathNavigator

Extraction de données XML à l'aide de XPathNavigator

Autres ressources

Prise en charge du type dans les classes System.Xml