Accesso a dati XML fortemente tipizzati con XPathNavigatorAccessing Strongly Typed XML Data Using XPathNavigator

Analogamente a un'istanza del modello di dati XPath versione 2.0, la classe XPathNavigator può contenere dati tipizzati in modo sicuro associati a tipi CLR (Common Language Runtime).As an instance of the XPath 2.0 data model, the XPathNavigator class can contain strongly-typed data that maps to common language runtime (CLR) types. In base al modello di dati XPath versione 2.0, solo gli elementi e gli attributi possono contenere dati tipizzati in modo sicuro.According to the XPath 2.0 data model, only elements and attributes can contain strongly-typed data. La classe XPathNavigator fornisce meccanismi di accesso ai dati di un oggetto XPathDocument o XmlDocument come dati tipizzati in modo sicuro e meccanismi di conversione da un tipo di dati a un altro.The XPathNavigator class provides mechanisms for accessing data within an XPathDocument or XmlDocument object as strongly-typed data as well as mechanisms for converting from one data type to another.

Informazioni sul tipo esposte da XPathNavigatorType Information Exposed by XPathNavigator

Tecnicamente, i dati XML versione 1.0 non dispongono di tipi, a meno che non vengano elaborati tramite una DTD, uno schema XSD (XML Schema Definition Language) o un altro meccanismo.XML 1.0 data is technically without type, unless processed with a DTD, XML schema definition language (XSD) schema, or other mechanism. Esistono diverse categorie di informazioni sul tipo che possono essere associate con un elemento o attributo XML.There are a number of categories of type information that can be associated with an XML element or attribute.

  • Tipi CLR semplici: nessun linguaggio XML Schema supporta i tipi CLR in modo diretto.Simple CLR Types: None of the XML Schema languages support Common Language Runtime (CLR) types directly. Dal momento che risulta utile poter visualizzare il contenuto semplice di elementi e attributi come tipo CLR più appropriato, è possibile tipizzare l'intero contenuto semplice come tipo String in assenza di informazioni sullo schema e di eventuali informazioni aggiunte che possano ottimizzare tale contenuto rendendolo un tipo più appropriato.Because it is useful to be able to view simple element and attribute content as the most appropriate CLR type, all simple content can be typed as String in the absence of schema information with any added schema information potentially refining this content to a more appropriate type. Per individuare il tipo CLR che corrisponde maggiormente al contenuto semplice dell'elemento o attributo, usare la proprietà ValueType.You can find the best matching CLR type of simple element and attribute content by using the ValueType property. Per altre informazioni sul mapping dai tipi incorporati nello schema a tipi CLR, vedere Supporto di tipi di dati nelle classi System.Xml.For more information about the mapping from schema built-in types to CLR types, see Type Support in the System.Xml Classes.

  • Elenchi di tipi semplici (CLR): un elemento o attributo con contenuto semplice può contenere un elenco di valori separati da spazi vuoti.Lists of Simple (CLR) Types: An element or attribute with simple content can contain a list of values separated by white space. I valori sono specificati da un XML Schema come "dati di tipo list".The values are specified by an XML Schema to be a "list type." In assenza di un XML Schema, questo contenuto semplice verrebbe considerato come un solo nodo di tipo text.In the absence of an XML Schema, such simple content would be treated as a single text node. Se invece è disponibile un XML Schema, questo contenuto semplice può essere esposto come una serie di valori specifici, ognuno dei quali dispone di un tipo semplice associato a una raccolta di oggetti CLR.When an XML Schema is available, this simple content can be exposed as a series of atomic values each having a simple type that maps to a collection of CLR objects. Per altre informazioni sul mapping dai tipi incorporati nello schema a tipi CLR, vedere Supporto di tipi di dati nelle classi System.Xml.For more information about the mapping from schema built-in types to CLR types, see Type Support in the System.Xml Classes.

  • Valore tipizzato: un attributo o un elemento con un tipo semplice convalidato in base a uno schema presenta un valore tipizzato.Typed Value: A schema-validated attribute or element with a simple type has a typed value. Questo valore è un tipo primitivo, ad esempio un tipo di dati numerico, di stringa o relativo alla data.This value is a primitive type such as a numeric, string, or date type. È possibile eseguire il mapping di tutti i tipi semplici incorporati in XSD a tipi CLR che consentono l'accesso al valore di un nodo come un tipo più appropriato anziché come un tipo String.All the built-in simple types in XSD can be mapped to CLR types that provide access to the value of a node as a more appropriate type instead of just as a String. Un elemento che presenta attributi o elementi figlio è considerato un tipo complesso.An element with attributes or element children is considered to be a complex type. Il valore tipizzato di un tipo complesso che presenta contenuto semplice, ovvero solo nodi di tipo text come nodi figlio, è uguale a quello del tipo semplice del relativo contenuto.The typed value of a complex type with simple content (only text nodes as children) is the same as that of the simple type of its content. Il valore tipizzato di un tipo complesso che presenta contenuto complesso, ovvero più di un elemento figlio, è il valore di stringa della concatenazione di tutti i nodi figlio di tipo text restituiti come tipo String.The typed value of a complex type with complex content (one or more child elements) is the string value of the concatenation of all its child text nodes returned as a String. Per altre informazioni sul mapping dai tipi incorporati nello schema a tipi CLR, vedere Supporto di tipi di dati nelle classi System.Xml.For more information about the mapping from schema built-in types to CLR types, see Type Support in the System.Xml Classes.

  • Nome del tipo specifico per il linguaggio di schema: nella maggior parte dei casi, i tipi CLR, impostati come effetto collaterale dell'applicazione di uno schema esterno, vengono usati per consentire l'accesso al valore di un nodo.Schema-Language Specific Type Name: In most cases, the CLR types, which are set as a side-effect of applying an external schema, are used to provide access to the value of a node. Tuttavia, in alcune situazioni è possibile che si desideri esaminare il tipo associato a uno schema particolare applicato a un documento XML.However, there may be situations where you may want to examine the type associated with a particular schema applied to an XML document. Ad esempio, è possibile che si desideri eseguire una ricerca nel documento XML ed estrarre tutti gli elementi per i quali è stato determinato un contenuto di tipo "PurchaseOrder" in base a uno schema associato.For example, you may wish to search through an XML document, extracting all elements that are determined to have content of type "PurchaseOrder" according to an attached schema. Queste informazioni sul tipo possono essere impostate solo in seguito alla convalida dello schema ed è possibile accedervi tramite le proprietà XmlType e SchemaInfo della classe XPathNavigator.Such type information can be set only as a result of schema validation and this information is accessed through the XmlType and SchemaInfo properties of the XPathNavigator class. Per altre informazioni, vedere di seguito la sezione relativa all'infoset sulla convalida post-schema.For more information, see The Post Schema Validation Infoset (PSVI) section below.

  • Reflection sul tipo specifico per il linguaggio di schema: in altri casi, è possibile che si desideri ottenere ulteriori informazioni sul tipo specifico per lo schema applicato a un documento XML.Schema-Language Specific Type Reflection: In other cases, you may want to obtain further details of the schema-specific type applied to an XML document. Ad esempio, durante la lettura di un file XML, è possibile che si desideri estrarre l'attributo maxOccurs per ciascun nodo valido nel documento XML per eseguire calcoli personalizzati.For example, when reading an XML file, you may want to extract the maxOccurs attribute for each valid node in the XML document in order to perform some custom calculation. Dal momento che queste informazioni vengono impostate solo in seguito alla convalida dello schema, è possibile accedervi tramite la proprietà SchemaInfo della classe XPathNavigator.Because this information is set only through schema validation, it is accessed through the SchemaInfo property of the XPathNavigator class. Per altre informazioni, vedere di seguito la sezione relativa all'infoset sulla convalida post-schema.For more information, see The Post Schema Validation Infoset (PSVI) section below.

Funzioni di accesso tipizzate di XPathNavigatorXPathNavigator Typed Accessors

Nella tabella seguente vengono illustrate le diverse proprietà e i diversi metodi della classe XPathNavigator che possono essere usati per accedere alle informazioni sul tipo di un nodo.The following table shows the various properties and methods of the XPathNavigator class that can be used to access the type information about a node.

ProprietàProperty DescrizioneDescription
XmlType Contiene le informazioni sul tipo di schema XML per il nodo se questo è valido.This contains the XML schema type information for the node if it is valid.
SchemaInfo Contiene l'infoset sulla convalida post-schema del nodo aggiunte dopo la convalida.This contains the Post Schema Validation Infoset of the node that is added after validation. Sono incluse le informazioni sul tipo di schema XML e le informazioni sulla validità.This includes the XML schema type information, as well as validity information.
ValueType Il tipo CLR del valore tipizzato del nodo.The CLR type of the typed value of the node.
TypedValue Il contenuto del nodo come uno o più valori CLR il cui tipo corrisponde maggiormente al tipo di schema XML del nodo.The content of the node as one or more CLR values whose type is the closest match to the XML schema type of the node.
ValueAsBoolean Il valore String del nodo corrente di cui viene eseguito il cast in un valore Boolean, in base alle regole di XPath versione 2.0 per l'esecuzione del cast in xs:boolean.The String value of the current node cast to a Boolean value, according to the XPath 2.0 casting rules for xs:boolean.
ValueAsDateTime Il valore String del nodo corrente di cui viene eseguito il cast in un valore DateTime, in base alle regole di XPath versione 2.0 per l'esecuzione del cast in xs:datetime.The String value of the current node cast to a DateTime value, according to the XPath 2.0 casting rules for xs:datetime.
ValueAsDouble Il valore String del nodo corrente di cui viene eseguito il cast in un valore Double, in base alle regole di XPath versione 2.0 per l'esecuzione del cast in xsd:double.The String value of the current node cast to a Double value, according to the XPath 2.0 casting rules for xsd:double.
ValueAsInt Il valore String del nodo corrente di cui viene eseguito il cast in un valore Int32, in base alle regole di XPath versione 2.0 per l'esecuzione del cast in xs:integer.The String value of the current node cast to a Int32 value, according to the XPath 2.0 casting rules for xs:integer.
ValueAsLong Il valore String del nodo corrente di cui viene eseguito il cast in un valore Int64, in base alle regole di XPath versione 2.0 per l'esecuzione del cast in xs:integer.The String value of the current node cast to a Int64 value, according to the XPath 2.0 casting rules for xs:integer.
ValueAs Il contenuto del nodo di cui viene eseguito il cast nel tipo di destinazione in base alle regole di XPath 2.0 per l'esecuzione del cast.The contents of the node cast to the target type according to the XPath 2.0 casting rules.

Per altre informazioni sul mapping dai tipi incorporati nello schema a tipi CLR, vedere Supporto di tipi di dati nelle classi System.Xml.For more information about the mapping from schema built-in types to CLR types, see Type Support in the System.Xml Classes.

Infoset sulla convalida post-schema (PSVI, Post Schema Validation Infoset)The Post Schema Validation Infoset (PSVI)

In un processore di XML Schema, un infoset XML viene accettato come input e viene convertito in un infoset sulla convalida post-schema.An XML Schema processor accepts an XML Infoset as input and converts it into a Post Schema Validation Infoset (PSVI). Un PSVI rappresenta l'infoset XML di input originale con nuovi elementi informazioni e nuove proprietà aggiunti agli elementi informazioni esistenti.A PSVI is the original input XML infoset with new information items added and new properties added to existing information items. Le informazioni aggiunte all'infoset XML nel PVSI possono essere suddivise in tre grandi classi che vengono esposte dal tipo XPathNavigator.There are three broad classes of information added to the XML Infoset in the PSVI that are exposed by the XPathNavigator.

  1. Risultati della convalida: informazioni relative all'esito della convalida di un elemento o di un attributo.Validation Outcomes: Information as to whether an element or attribute was successfully validated or not. Tali informazioni vengono esposte dalla proprietà Validity della proprietà SchemaInfo della classe XPathNavigator.This is exposed by the Validity property of the SchemaInfo property of the XPathNavigator class.

  2. Informazioni predefinite: viene indicato se il valore dell'elemento o dell'attributo sia stato ottenuto o meno mediante i valori predefiniti specificati nello schema.Default Information: Indications as to whether the value of the element or attribute was obtained via default values specified in the schema or not. Tali informazioni vengono esposte dalla proprietà IsDefault della proprietà SchemaInfo della classe XPathNavigator.This is exposed by the IsDefault property of the SchemaInfo property of the XPathNavigator class.

  3. Annotazioni di tipi: riferimenti a componenti dello schema che potrebbero essere definizioni di tipi o dichiarazioni di attributo o elemento.Type Annotations: References to schema components that may be type definitions or element and attribute declarations. La proprietà XmlType del tipo XPathNavigator contiene le informazioni sul tipo specifiche del nodo se questo è valido.The XmlType property of the XPathNavigator contains the specific type information of the node if it is valid. Se la validità di un nodo è sconosciuta, ad esempio nel caso in cui il nodo sia stato convalidato e modificato successivamente,If the validity of a node is unknown, such as when it was validated then subsequently edited. la proprietà XmlType sarà impostata su null ma le informazioni sul tipo saranno ancora disponibili mediante diverse proprietà della proprietà SchemaInfo della classe XPathNavigator.then the XmlType property is set to null but type information is still available from the various properties of the SchemaInfo property of the XPathNavigator class.

Nell'esempio seguente viene illustrato l'uso delle informazioni nell'infoset sulla convalida post-schema esposto dal tipo XPathNavigator.The following example illustrates using information in the Post Schema Validation Infoset exposed by the 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);  

Nell'esempio il file books.xml viene considerato come input.The example takes the books.xml file as input.

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

Anche lo schema books.xsd viene considerato come input.The example also takes the books.xsd schema as input.

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

Recupero di valori tipizzati mediante le proprietà ValueAsObtain Typed Values Using ValueAs Properties

Il valore tipizzato di un nodo può essere recuperato accedendo alla proprietà TypedValue del tipo XPathNavigator.The typed value of a node can be retrieved by accessing the TypedValue property of the XPathNavigator. In alcuni casi, è possibile che si desideri convertire il valore tipizzato di un nodo in un tipo diverso.In certain cases you may want to convert the typed value of a node to a different type. Un esempio comune è rappresentato dal recupero di un valore numerico da un nodo XML.A common example is to get a numeric value from an XML node. Si consideri, ad esempio, il seguente documento XML non convalidato né tipizzato:For example, consider the following unvalidated and untyped XML document.

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

Se il tipo XPathNavigator è posizionato sull'elemento price, la proprietà XmlType sarà null, la proprietà ValueType sarà String e la proprietà TypedValue sarà la stringa 10.00.If the XPathNavigator is positioned on the price element the XmlType property would be null, the ValueType property would be String, and the TypedValue property would be the string 10.00.

Tuttavia, è possibile estrarre il valore come valore numerico usando il metodo ValueAs oppure la proprietà ValueAsDouble, ValueAsInt o ValueAsLong.However, it is still possible to extract the value as a numeric value using the ValueAs, ValueAsDouble, ValueAsInt, or ValueAsLong method and properties. Nell'esempio seguente viene illustrata l'esecuzione di questo cast usando il metodo ValueAs.The following example illustrates performing such a cast using the ValueAs method.

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

Per altre informazioni sul mapping dai tipi incorporati nello schema a tipi CLR, vedere Supporto di tipi di dati nelle classi System.Xml.For more information about the mapping from schema built-in types to CLR types, see Type Support in the System.Xml Classes.

Vedere ancheSee Also

XmlDocument
XPathDocument
XPathNavigator
Supporto di tipi di dati nelle classi System.XmlType Support in the System.Xml Classes
Elaborazione di dati XML con il modello di dati XPathProcess XML Data Using the XPath Data Model
Navigazione del set di nodi con XPathNavigatorNode Set Navigation Using XPathNavigator
Navigazione dei nodi di attributi e dello spazio dei nomi con XPathNavigatorAttribute and Namespace Node Navigation Using XPathNavigator
Estrarre dati XML con XPathNavigatorExtract XML Data Using XPathNavigator