Lettura del contenuto di elementi e attributi

Per leggere il contenuto di elementi e attributi in una sola chiamata, XmlReader fornisce i metodi ReadInnerXml e ReadOuterXml. Quando viene posizionata su un nodo, tutto il contenuto del nodo, incluso il tag, iniziando dopo il tag dell'elemento fino al tag finale dell'elemento, viene estratto dal nodo dalla proprietà ReadInnerXml. Dopo la chiamata a ReadInnerXml, XmlReader viene posizionato dopo il tag finale dell'elemento. Dato l'input XML seguente:

Input

<Book>
 <Price Retail="29.95" />
 <Title BookTitle="My First Book" author="me" />
</Book>

questo è l'output restituito come risultato della chiamata a ReadInnerXml quando il reader viene posizionato sull'elemento Book:

 <Price Retail="29.95" />
 <Title BookTitle="My First Book" author="me" />

ReadInnerXml colloca il reader dopo il tag finale dell'elemento letto. Pertanto, nell'input sopra riportato, il nodo corrente è quello dopo l'elemento finale </Book>, supponendo che ne esista uno. L'esecuzione di un metodo Read lo farebbe quindi avanzare di un altro elemento. Nell'esempio di codice che segue viene illustrato il nodo corrente del flusso dopo la chiamata a ReadInnerXml e come l'esecuzione di un metodo Read dopo ReadInnerXml faccia avanzare il reader di un ulteriore nodo.

public static void Main() 
{
    string text = @"<book><one><title>ABC</title></one><two><price>24.95</price></two></book>";
    XmlTextReader reader = new XmlTextReader(new StringReader(text));
    reader.WhitespaceHandling = WhitespaceHandling.None;

    // Moves the reader to the 'book' node.
    reader.MoveToContent(); 

    // Moves the reader to the 'one' node.
    reader.Read(); 
    reader.MoveToContent();

    // Reads the inner XML of the 'one' node, which is the entire 'title'
    // node, and outputs <title>ABC</title>. 
    Console.WriteLine(reader.ReadInnerXml()); 

    // The reader is now positioned on the 'two' node.
    Console.WriteLine(reader.Name);

    // Calling Read will advance the reader beyond the 'two' node to 
    // the 'price' node.
    reader.Read();
    // Outputs the node of 'price'.
    Console.WriteLine(reader.Name);
}

L'output del codice è il seguente:

<title>ABC</title>

two

price

ReadInnerXml consente di analizzare l'XML e di restituire il contenuto, a seconda del XmlNodeType. Nella tabella riportata di seguito, è indicato un esempio di contenuto di un elemento e di un attributo, i valori restituiti da una chiamata a ReadInnerXml e la posizione del reader dopo la chiamata.

Tipo di nodo Contenuto del figlio Valore restituito Posizione
Elemento <myelem> text </myelem> text Sul nodo dopo l'elemento finale </myelem>
Attributo <myelem attr1="val1" attr2="val2"> text </myelem> val1 Rimane sul nodo dell'attributo "attr1".

Con tutti gli altri XmlNodeTypes viene restituito string.Empty.

Il comportamento del metodo ReadOuterXml è simile a quello del metodo ReadInnerXml, con l'eccezione che il valore restituito da ReadOuterXml include il tag iniziale e finale. Quando viene posizionato su un nodo secondario, questo metodo è identico all'esecuzione di un'operazione Read.

ReadOuterXml consente di analizzare l'XML e di restituire il contenuto di numerosi figli, a seconda dell'XmlNodeType corrente. Nella tabella riportata di seguito, è indicato un esempio di contenuto di un elemento e di un attributo, i valori restituiti da una chiamata a ReadOuterXml e la posizione del reader dopo la chiamata.

Tipo di nodo Contenuto del figlio Valore restituito Posizione
Elemento <elem1> text </elem1> <elem1> text </elem1> Posizionato dopo il tag </elem1>.
Attributo <elem1 attr1="attrValue1" attr2="attrValue2" > text </elem1> attr1="attrValue1" Posizionato sul nodo dell'attributo "attr1".

Tutti gli altri tipi di nodo restituiscono a ReadOuterXml string.Empty.

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 | Omissione del contenuto con XmlReader | 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