Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Come istanza del modello di dati XPath 2.0, la classe XPathNavigator può contenere dati a forte tipizzazione mappati a tipi CLR (Common Language Runtime). In base al modello di dati XPath 2.0, solo gli elementi e gli attributi possono contenere dati fortemente tipizzato. La XPathNavigator classe fornisce meccanismi per l'accesso ai dati all'interno di un oggetto XPathDocument o XmlDocument come dati fortemente tipizzati, nonché meccanismi per la conversione da un tipo di dati a un altro.
Informazioni sul tipo esposte da XPathNavigator
I dati XML 1.0 sono tecnicamente senza tipo, a meno che non vengano elaborati con uno schema DTD, uno schema XSD (XML Schema Definition Language) o un altro meccanismo. Esistono diverse categorie di informazioni sul tipo che possono essere associate a un elemento o a un attributo XML.
Tipi CLR semplici: nessuno dei linguaggi XML Schema supporta direttamente i tipi CLR (Common Language Runtime). Poiché è utile essere in grado di visualizzare contenuto semplice di elementi e attributi come tipo CLR più appropriato, tutto il contenuto semplice può essere tipizzato come String in assenza di informazioni sullo schema con eventuali informazioni sullo schema aggiunte potenzialmente affinando questo contenuto in un tipo più appropriato. È possibile trovare il tipo CLR migliore corrispondente di contenuto semplice di elementi e attributi usando la proprietà ValueType. Per altre informazioni sul mapping dai tipi predefiniti dello schema ai tipi CLR, vedere Supporto dei tipi nelle classi System.Xml.
Elenchi di tipi SIMPLE (CLR): un elemento o un attributo con contenuto semplice può contenere un elenco di valori separati da spazi vuoti. I valori vengono specificati da un XML Schema come "tipo elenco". In assenza di un XML Schema, tale contenuto semplice verrebbe considerato come un singolo nodo di testo. Quando è disponibile un XML Schema, questo contenuto semplice può essere esposto come una serie di valori atomici ognuno con un tipo semplice che esegue il mapping a una raccolta di oggetti CLR. Per altre informazioni sul mapping dai tipi predefiniti dello schema ai tipi CLR, vedere Supporto dei tipi nelle classi System.Xml.
Valore tipizzato: un attributo o un elemento convalidato con schema con un tipo semplice ha un valore tipizzato. Questo valore è un tipo primitivo, ad esempio un tipo numerico, stringa o data. È possibile eseguire il mapping di tutti i tipi semplici predefiniti in XSD ai tipi CLR che offrono l'accesso al valore di un nodo come tipo più appropriato invece che semplicemente come String. Un elemento con attributi o figli viene considerato un tipo complesso. Il valore tipizzato di un tipo complesso con contenuto semplice (solo nodi di testo come figli) è lo stesso di quello del tipo semplice del suo contenuto. Il valore tipizzato di un tipo complesso con contenuto complesso (uno o più elementi figlio) è il valore stringa della concatenazione di tutti i nodi di testo figlio restituiti come .String Per altre informazioni sul mapping dai tipi predefiniti dello schema ai tipi CLR, vedere Supporto dei tipi nelle classi System.Xml.
Schema-Language Nome tipo specifico: nella maggior parte dei casi, i tipi CLR, impostati come effetto collaterale dell'applicazione di uno schema esterno, vengono usati per fornire l'accesso al valore di un nodo. Tuttavia, potrebbe essere necessario esaminare il tipo associato a uno schema specifico applicato a un documento XML. Ad esempio, è possibile cercare un documento XML, estraendo tutti gli elementi determinati per avere contenuto di tipo "PurchaseOrder" in base a uno schema associato. Tali informazioni sul tipo possono essere impostate solo in seguito alla convalida dello schema e queste informazioni sono accessibili tramite le XmlType proprietà e SchemaInfo della XPathNavigator classe . Per altre informazioni, vedere la sezione Post Schema Validation Infoset (PSVI) di seguito.
Schema-Language Riflessione su tipo specifico: in altri casi, è possibile ottenere ulteriori dettagli sul tipo specifico dello schema applicato a un documento XML. Ad esempio, quando si legge un file XML, è possibile estrarre l'attributo
maxOccursper ogni nodo valido nel documento XML per eseguire un calcolo personalizzato. Poiché queste informazioni vengono impostate solo tramite la convalida dello schema, viene eseguito l'accesso tramite la SchemaInfo proprietà della XPathNavigator classe . Per altre informazioni, vedere la sezione Post Schema Validation Infoset (PSVI) di seguito.
Funzioni di accesso tipe XPathNavigator
Nella tabella seguente vengono illustrati i vari metodi e proprietà della XPathNavigator classe che possono essere usati per accedere alle informazioni sul tipo su un nodo.
| Proprietà | Descrizione |
|---|---|
| XmlType | Contiene le informazioni sul tipo di XML Schema per il nodo, se valido. |
| SchemaInfo | Include il Post Schema Validation Infoset del nodo che è aggiunto dopo la convalida. Sono incluse le informazioni sul tipo di XML Schema, nonché informazioni sulla validità. |
| ValueType | Tipo CLR del valore tipizzato del nodo. |
| TypedValue | Il contenuto del nodo come uno o più valori CLR il cui tipo corrisponde più strettamente al tipo dello schema XML del nodo. |
| ValueAsBoolean | Il valore String del nodo corrente convertito in un valore Boolean secondo le regole di cast di XPath 2.0 per xs:boolean. |
| ValueAsDateTime | Il valore String del nodo corrente convertito in un valore DateTime secondo le regole di cast di XPath 2.0 per xs:datetime. |
| ValueAsDouble | Il valore String del nodo corrente convertito in un valore Double secondo le regole di cast di XPath 2.0 per xsd:double. |
| ValueAsInt | Il valore String del nodo corrente convertito in un valore Int32 secondo le regole di cast di XPath 2.0 per xs:integer. |
| ValueAsLong | Il valore String del nodo corrente convertito in un valore Int64 secondo le regole di cast di XPath 2.0 per xs:integer. |
| ValueAs | Il contenuto del nodo viene convertito al tipo di destinazione secondo le regole di casting di XPath 2.0. |
Per altre informazioni sul mapping dai tipi predefiniti dello schema ai tipi CLR, vedere Supporto dei tipi nelle classi System.Xml.
Infoset post-convalida dello schema (PSVI)
Un processore XML Schema accetta un Infoset XML come input e lo converte in un Infoset di convalida post schema (PSVI). Un PSVI è l'infoset XML di input originale con nuovi elementi di informazioni aggiunti e nuove proprietà aggiunte agli elementi di informazioni esistenti. Esistono tre classi generali di informazioni aggiunte all'Infoset XML in PSVI esposte da XPathNavigator.
Risultati della convalida: informazioni su come verificare se un elemento o un attributo è stato convalidato correttamente. Questa è esposta dalla proprietà Validity della proprietà SchemaInfo della classe XPathNavigator.
Informazioni predefinite: indica se il valore dell'elemento o dell'attributo è stato ottenuto tramite valori predefiniti specificati nello schema o meno. Questa è esposta dalla proprietà IsDefault della proprietà SchemaInfo della classe XPathNavigator.
Annotazioni di tipo: riferimenti ai componenti dello schema che possono essere definizioni di tipi o dichiarazioni di elementi e attributi. La XmlType proprietà dell'oggetto XPathNavigator contiene le informazioni sul tipo specifico del nodo, se è valido. Se la validità di un nodo è sconosciuta, ad esempio quando è stata convalidata, successivamente modificata. la proprietà XmlType viene quindi impostata su
nullma le informazioni sul tipo sono ancora disponibili dalle varie proprietà della SchemaInfo proprietà della classe XPathNavigator.
Nell'esempio seguente viene illustrato l'utilizzo delle informazioni nell'infoset di validazione dello schema post esposto da 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'esempio accetta il file books.xml come input.
<books xmlns="http://www.contoso.com/books">
<book>
<title>Title</title>
<price>10.00</price>
<published>2003-12-31</published>
</book>
</books>
L'esempio accetta anche lo books.xsd schema come 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>
Ottenere valori tipizzati usando le proprietà ValueAs
Il valore tipizzato di un nodo può essere recuperato accedendo alla TypedValue proprietà di XPathNavigator. In alcuni casi può essere necessario convertire il valore tipizzato di un nodo in un tipo diverso. Un esempio comune consiste nel ottenere un valore numerico da un nodo XML. Si consideri, ad esempio, il documento XML non convalidato e non tipizzato seguente.
<books>
<book>
<title>Title</title>
<price>10.00</price>
<published>2003-12-31</published>
</book>
</books>
Se l'oggetto XPathNavigator è posizionato sull'elemento price , la XmlType proprietà nullsarà , la ValueType proprietà sarà Stringe la TypedValue proprietà sarà la stringa 10.00.
Tuttavia, è comunque possibile estrarre il valore come valore numerico usando il ValueAs, ValueAsDouble, ValueAsInt o ValueAsLong metodi e proprietà. Nell'esempio seguente viene illustrata l'esecuzione di un cast di questo tipo usando il metodo 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));
Per altre informazioni sul mapping dai tipi predefiniti dello schema ai tipi CLR, vedere Supporto dei tipi nelle classi System.Xml.
Vedere anche
- XmlDocument
- XPathDocument
- XPathNavigator
- Supporto dei tipi nelle classi System.Xml
- Elaborare dati XML usando il modello di dati XPath
- Navigazione del set di nodi utilizzando XPathNavigator
- Navigazione tra attributi e nodi dello spazio dei nomi tramite XPathNavigator
- Estrarre dati XML tramite XPathNavigator