Omissione del contenuto con XmlReader

Il contenuto viene omesso in due modi. Il primo consiste nel richiamare un metodo che si sposta direttamente nel contenuto, utilizzando il metodo MoveToContent. L'altro consiste nel richiamare direttamente il metodo Skip, che consente di omettere i nodi figlio dal nodo corrente.

Spostamento diretto nel contenuto

Per spostarsi nel contenuto, utilizzare il metodo MoveToContent. Il nodo corrente viene verificato dal metodo che determina se tale nodo è un nodo del contenuto. Per nodo del contenuto si intende qualsiasi nodo Text, CDATA, Element, EndElement, EntityReference o EndEntity. Se non si tratta di uno dei tipi di nodo sopra elencati, tale nodo viene ignorato e si passa al nodo successivo o alla fine del file. L'omissione prosegue fino a quando non si trova un nodo di quel tipo o la fine del file, quindi si arresta. In altre parole, i tipi di nodo seguenti vengono ignorati:

  • XmlDeclaration
  • ProcessingInstruction
  • DocumentType
  • Comment
  • Attribute
  • Whitespace
  • SignificantWhitespace

Utilizzando questo tipo di contenuto, l'esplorazione è più efficiente se l'applicazione vuole solo il contenuto, invece di richiamare Read con il quale il reader viene spostato al nodo successivo e l'applicazione viene forzata a eseguire il test del tipo di nodo e a determinare se vi è contenuto da leggere e nel tal caso lo legge.

Se l'applicazione viene posizionata sul nodo di un attributo, richiamando MoveToContent si sposta la posizione del nodo corrente sull'elemento che possiede tale attributo. Se l'applicazione è già posizionata su un nodo del contenuto, la chiamata a MoveToContent restituirà all'applicazione il valore della proprietà NodeType. Questi comportamenti consentono all'applicazione di omettere i tag XML casuali. Si consideri ad esempio il seguente input XML:

<?xml version="1.0">
<!DOCTYPE price SYSTEM "abc">
<!––the price of the book –->
<price>123.4</price>

Il codice riportato di seguito trova l'elemento price di "123.4" e ne converte il contenuto di testo in double:

If readr.MoveToContent() = XmlNodeType.Element And readr.Name = "price" Then
   _price = XmlConvert.ToDouble(readr.ReadString())
End If
[C#]
if (readr.MoveToContent() == XmlNodeType.Element && readr.Name =="price")
{
    _price = XmlConvert.ToDouble(readr.ReadString());
}

Per fare un altro esempio, MoveToContent viene spesso utilizzato per trovare il nodo DocumentElement in un file XML. Dato il file di input XML seguente chiamato file.xml:

<?xml encoding="utf-8"?>
<!-- Can have comment and DOCTYPE nodes here to skip past here -->
<phone a="2" b="N">
<data>
   <d1>Data</d1>
   <d2>More Data</d2>
   <d3>Some More Data</d3>
</data>
</phone>

il codice seguente posiziona il reader sul nodo DocumentElement <phone>:

Dim doc as XmlDocument = New XmlDocument()
Dim treader as New XmlTextReader("file.xml")
treader.MoveToContent()        
[C#]
XmlDocument doc = new XmlDocument();
XmlTextReader treader = new XmlTextReader("file.xml");
treader.MoveToContent();

Omissione dei dati con il metodo Skip

Il metodo Skip consente di spostarsi oltre l'elemento corrente. Se il tipo di nodo è XmlNodeType.Element, richiamando Skip ci si sposta oltre tutto il contenuto dell'elemento e il tag finale dell'elemento.

Si supponga ad esempio di disporre dell'XML seguente:

<a name="facts" location="123">
<x/> 
abc 
<y/>
</a>
<b>
...
</b>

e di essere posizionati sul nodo <a> o su uno dei suoi attributi, richiamando Skip si viene posizionati sul nodo <b>. Se si è posizionati su un nodo secondario, come x, o sul nodo di testo abc, Skip passerà al nodo successivo, il che significa che si comporta effettivamente come se si richiamasse Read.

Skip consente di applicare le regole del formato corretto al contenuto.

Vedere anche

Lettura dell'XML con XmlReader | Posizione corrente dei nodi in XmlReader | Impostazioni delle proprietà su XmlReader | Confronto di oggetti utilizzando XmlNameTable con XmlReader | Lettura degli attributi con XmlReader | Lettura del contenuto di elementi e attributi | Lettura ed espansione con EntityReference | Confronto di XmlReader con il lettore SAX | Lettura dei dati XML con XmlTextReader | Lettura delle strutture dei nodi con XmlNodeReader | Convalida dell'XML con XmlValidatingReader | Creazione di un reader XML personalizzato | Classe XmlReader | Membri XmlReader | Classe XmlNodeReader | Membri XmlNodeReader | Classe XmlTextReader | Membri XmlTextReader | Classe XmlValidatingReader | XmlValidatingReader