Condividi tramite


Inserimento dei dati XML utilizzando XPathNavigator

La classe XPathNavigator fornisce un set di metodi utilizzati per inserire nodi di pari livello, nodi figlio e nodi Attribute in un documento XML. Per utilizzare tali metodi, l'oggetto XPathNavigator deve essere modificabile, ovvero la proprietà corrispondente CanEdit deve essere true.

Gli oggetti XPathNavigator che possono modificare un documento XML vengono creati dal metodo CreateNavigator della classe XmlDocument. Gli oggetti XPathNavigator creati dalla classe XPathDocument sono di sola lettura e qualsiasi tentativo di utilizzare i metodi di modifica di un oggetto XPathNavigator creato da un oggetto XPathDocument genererà un oggetto NotSupportedException.

Per ulteriori informazioni sulla creazione di oggetti XPathNavigator modificabili, vedere Lettura di dati XML con XPathDocument e XmlDocument.

Inserimento di nodi

La classe XPathNavigator fornisce i metodi per inserire nodi di pari livello, nodi figlio e nodi Attribute in un documento XML. Tali metodi consentono di inserire nodi e attributi in diverse posizioni in relazione alla posizione corrente di un oggetto XPathNavigator e vengono descritti nelle seguenti sezioni.

Inserimento di nodi di pari livello

La classe XPathNavigator fornisce i seguenti metodi per inserire nodi di pari livello.

Tali metodi consentono di inserire nodi di pari livello prima e dopo il nodo su cui l'oggetto XPathNavigator è attualmente posizionato.

I metodi InsertAfter e InsertBefore sono in overload e accettano un oggetto string, XmlReader o un oggetto XPathNavigator contenente il nodo di pari livello da aggiungere come parametro. Entrambi i metodi restituiscono inoltre un oggetto XmlWriter utilizzato per inserire i nodi di pari livello.

Nei metodi InsertElementAfter e InsertElementBefore viene inserito un nodo singolo di pari livello prima e dopo il nodo su cui un oggetto XPathNavigator è attualmente posizionato utilizzando come parametri il prefisso dello spazio dei nomi, il nome locale, l'URI dello spazio dei nomi e il valore specificato.

Nell'esempio seguente viene inserito un nuovo elemento pages prima dell'elemento figlio price del primo elemento book nel file contosoBooks.xml.

Dim document As XmlDocument = New XmlDocument()
document.Load("contosoBooks.xml")
Dim navigator As XPathNavigator = document.CreateNavigator()

navigator.MoveToChild("bookstore", "https://www.contoso.com/books")
navigator.MoveToChild("book", "https://www.contoso.com/books")
navigator.MoveToChild("price", "https://www.contoso.com/books")

navigator.InsertBefore("<pages>100</pages>")

navigator.MoveToParent()
Console.WriteLine(navigator.OuterXml)
XmlDocument document = new XmlDocument();
document.Load("contosoBooks.xml");
XPathNavigator navigator = document.CreateNavigator();

navigator.MoveToChild("bookstore", "https://www.contoso.com/books");
navigator.MoveToChild("book", "https://www.contoso.com/books");
navigator.MoveToChild("price", "https://www.contoso.com/books");

navigator.InsertBefore("<pages>100</pages>");

navigator.MoveToParent();
Console.WriteLine(navigator.OuterXml);
XmlDocument^ document = gcnew XmlDocument();
document->Load("contosoBooks.xml");
XPathNavigator^ navigator = document->CreateNavigator();

navigator->MoveToChild("bookstore", "https://www.contoso.com/books");
navigator->MoveToChild("book", "https://www.contoso.com/books");
navigator->MoveToChild("price", "https://www.contoso.com/books");

navigator->InsertBefore("<pages>100</pages>");

navigator->MoveToParent();
Console::WriteLine(navigator->OuterXml);

Nell'esempio il file contosoBooks.xml viene considerato come input.

<?xml version="1.0" encoding="utf-8" ?>
<bookstore xmlns="https://www.contoso.com/books">
    <book genre="autobiography" publicationdate="1981-03-22" ISBN="1-861003-11-0">
        <title>The Autobiography of Benjamin Franklin</title>
        <author>
            <first-name>Benjamin</first-name>
            <last-name>Franklin</last-name>
        </author>
        <price>8.99</price>
    </book>
    <book genre="novel" publicationdate="1967-11-17" ISBN="0-201-63361-2">
        <title>The Confidence Man</title>
        <author>
            <first-name>Herman</first-name>
            <last-name>Melville</last-name>
        </author>
        <price>11.99</price>
    </book>
    <book genre="philosophy" publicationdate="1991-02-15" ISBN="1-861001-57-6">
        <title>The Gorgias</title>
        <author>
            <name>Plato</name>
        </author>
        <price>9.99</price>
    </book>
</bookstore>

Per ulteriori informazioni sui metodi InsertAfter, InsertBefore, InsertElementAfter e InsertElementBefore, vedere la documentazione di riferimento per la classe XPathNavigator.

Inserimento di nodi figlio

La classe XPathNavigator fornisce i seguenti metodi per inserire nodi figlio.

In tali metodi i nodi figlio sono aggiunti o anteposti alla fine e all'inizio dell'elenco dei nodi figlio del nodo sul quale un oggetto XPathNavigator è attualmente posizionato.

Analogamente ai metodi descritti nella sezione "Inserimento di nodi di pari livello", nei metodi AppendChild e PrependChild viene accettato un oggetto string, XmlReader o un oggetto XPathNavigator contenente il nodo figlio da aggiungere come parametri. Entrambi i metodi restituiscono inoltre un oggetto XmlWriter utilizzato per inserire i nodi figlio.

Analogamente ai metodi descritti nella sezione "Inserimento di nodi di pari livello", nei metodi AppendChildElement e PrependChildElement viene inserito un singolo nodo figlio alla fine e all'inizio dell'elenco dei nodi figlio del nodo su cui è attualmente posizionato un oggetto XPathNavigator utilizzando come parametri il prefisso dello spazio dei nomi, il nome locale, l'URI dello spazio dei nomi e il valore specificato.

Nell'esempio seguente, viene aggiunto un nuovo elemento figlio pages all'elenco degli elementi figlio del primo elemento book nel file contosoBooks.xml.

Dim document As XmlDocument = New XmlDocument()
document.Load("contosoBooks.xml")
Dim navigator As XPathNavigator = document.CreateNavigator()

navigator.MoveToChild("bookstore", "https://www.contoso.com/books")
navigator.MoveToChild("book", "https://www.contoso.com/books")

navigator.AppendChild("<pages>100</pages>")

Console.WriteLine(navigator.OuterXml)
XmlDocument document = new XmlDocument();
document.Load("contosoBooks.xml");
XPathNavigator navigator = document.CreateNavigator();

navigator.MoveToChild("bookstore", "https://www.contoso.com/books");
navigator.MoveToChild("book", "https://www.contoso.com/books");

navigator.AppendChild("<pages>100</pages>");

Console.WriteLine(navigator.OuterXml);
XmlDocument^ document = gcnew XmlDocument();
document->Load("contosoBooks.xml");
XPathNavigator^ navigator = document->CreateNavigator();

navigator->MoveToChild("bookstore", "https://www.contoso.com/books");
navigator->MoveToChild("book", "https://www.contoso.com/books");

navigator->AppendChild("<pages>100</pages>");

Console::WriteLine(navigator->OuterXml);

Nell'esempio il file contosoBooks.xml viene considerato come input.

<?xml version="1.0" encoding="utf-8" ?>
<bookstore xmlns="https://www.contoso.com/books">
    <book genre="autobiography" publicationdate="1981-03-22" ISBN="1-861003-11-0">
        <title>The Autobiography of Benjamin Franklin</title>
        <author>
            <first-name>Benjamin</first-name>
            <last-name>Franklin</last-name>
        </author>
        <price>8.99</price>
    </book>
    <book genre="novel" publicationdate="1967-11-17" ISBN="0-201-63361-2">
        <title>The Confidence Man</title>
        <author>
            <first-name>Herman</first-name>
            <last-name>Melville</last-name>
        </author>
        <price>11.99</price>
    </book>
    <book genre="philosophy" publicationdate="1991-02-15" ISBN="1-861001-57-6">
        <title>The Gorgias</title>
        <author>
            <name>Plato</name>
        </author>
        <price>9.99</price>
    </book>
</bookstore>

Per ulteriori informazioni sui metodi AppendChild, PrependChild, AppendChildElement e PrependChildElement, vedere la documentazione di riferimento per la classe XPathNavigator.

Inserimento di nodi Attribute

La classe XPathNavigator fornisce i seguenti metodi per inserire nodi Attribute.

Tali metodi consentono di inserire nodi Attribute sul nodo di tipo element su cui un oggetto XPathNavigator è attualmente posizionato. Nel metodo CreateAttribute viene creato un nodo Attribute sul nodo di tipo element su cui un oggetto XPathNavigator è attualmente posizionato utilizzando come parametri il prefisso dello spazio dei nomi, il nome locale, l'URI dello spazio dei nomi e il valore specificato. Il metodo CreateAttributes restituisce un oggetto XmlWriter utilizzato per inserire i nodi Attribute.

Nell'esempio seguente vengono creati nuovi attributi discount e currency sull'elemento figlio price del primo elemento book nel file contosoBooks.xml utilizzando l'oggetto XmlWriter restituito dal metodo CreateAttributes.

Dim document As XmlDocument = New XmlDocument()
document.Load("contosoBooks.xml")
Dim navigator As XPathNavigator = document.CreateNavigator()

navigator.MoveToChild("bookstore", "https://www.contoso.com/books")
navigator.MoveToChild("book", "https://www.contoso.com/books")
navigator.MoveToChild("price", "https://www.contoso.com/books")

Dim attributes As XmlWriter = navigator.CreateAttributes()

attributes.WriteAttributeString("discount", "1.00")
attributes.WriteAttributeString("currency", "USD")
attributes.Close()

navigator.MoveToParent()
Console.WriteLine(navigator.OuterXml)
XmlDocument document = new XmlDocument();
document.Load("contosoBooks.xml");
XPathNavigator navigator = document.CreateNavigator();

navigator.MoveToChild("bookstore", "https://www.contoso.com/books");
navigator.MoveToChild("book", "https://www.contoso.com/books");
navigator.MoveToChild("price", "https://www.contoso.com/books");

XmlWriter attributes = navigator.CreateAttributes();

attributes.WriteAttributeString("discount", "1.00");
attributes.WriteAttributeString("currency", "USD");
attributes.Close();

navigator.MoveToParent();
Console.WriteLine(navigator.OuterXml);
XmlDocument^ document = gcnew XmlDocument();
document->Load("contosoBooks.xml");
XPathNavigator^ navigator = document->CreateNavigator();

navigator->MoveToChild("bookstore", "https://www.contoso.com/books");
navigator->MoveToChild("book", "https://www.contoso.com/books");
navigator->MoveToChild("price", "https://www.contoso.com/books");

XmlWriter^ attributes = navigator->CreateAttributes();

attributes->WriteAttributeString("discount", "1.00");
attributes->WriteAttributeString("currency", "USD");
attributes->Close();

navigator->MoveToParent();
Console::WriteLine(navigator->OuterXml);

Nell'esempio il file contosoBooks.xml viene considerato come input.

<?xml version="1.0" encoding="utf-8" ?>
<bookstore xmlns="https://www.contoso.com/books">
    <book genre="autobiography" publicationdate="1981-03-22" ISBN="1-861003-11-0">
        <title>The Autobiography of Benjamin Franklin</title>
        <author>
            <first-name>Benjamin</first-name>
            <last-name>Franklin</last-name>
        </author>
        <price>8.99</price>
    </book>
    <book genre="novel" publicationdate="1967-11-17" ISBN="0-201-63361-2">
        <title>The Confidence Man</title>
        <author>
            <first-name>Herman</first-name>
            <last-name>Melville</last-name>
        </author>
        <price>11.99</price>
    </book>
    <book genre="philosophy" publicationdate="1991-02-15" ISBN="1-861001-57-6">
        <title>The Gorgias</title>
        <author>
            <name>Plato</name>
        </author>
        <price>9.99</price>
    </book>
</bookstore>

Per ulteriori informazioni sui metodi CreateAttribute e CreateAttributes, vedere la documentazione di riferimento per la classe XPathNavigator.

Copia di nodi

In alcuni casi può essere necessario compilare un documento XML con il contenuto di un altro documento XML. Entrambe le classi XPathNavigator e XmlWriter sono in grado di copiare i nodi in un oggettoXmlDocument proveniente da un oggetto XmlReader esistente o da un oggetto XPathNavigator.

Gli overload dei metodi AppendChild, PrependChild, InsertBefore e InsertAfter della classe XPathNavigator accettano tutti un oggetto XPathNavigator o un oggetto XmlReader come parametro.

Gli overload del metodo WriteNode della classe XmlWriter possono accettare un oggetto XmlNode, XmlReader o XPathNavigator.

Nell'esempio seguente tutti gli elementi book vengono copiati da un documento all'altro.

Dim document As XmlDocument = New XmlDocument()
document.Load("books.xml")
Dim navigator As XPathNavigator = document.CreateNavigator()

navigator.MoveToChild("bookstore", String.Empty)

Dim newBooks As XPathDocument = New XPathDocument("newBooks.xml")
Dim newBooksNavigator As XPathNavigator = newBooks.CreateNavigator()

Dim nav As XPathNavigator
For Each nav in newBooksNavigator.SelectDescendants("book", "", false)
    navigator.AppendChild(nav)
Next

document.Save("newBooks.xml");
XmlDocument document = new XmlDocument();
document.Load("books.xml");
XPathNavigator navigator = document.CreateNavigator();

navigator.MoveToChild("bookstore", String.Empty);
            
XPathDocument newBooks = new XPathDocument("newBooks.xml");
XPathNavigator newBooksNavigator = newBooks.CreateNavigator();

foreach (XPathNavigator nav in newBooksNavigator.SelectDescendants("book", "", false))
{
    navigator.AppendChild(nav);
}

document.Save("newBooks.xml");

Inserimento dei valori

La classe XPathNavigator fornisce i metodi SetValue e SetTypedValue per inserire i valori di un nodo in un oggetto XmlDocument.

Inserimento di valori non tipizzati

Il metodo SetValue inserisce semplicemente il valore string non tipizzato passato come parametro del valore del nodo su cui l'oggetto XPathNavigator è attualmente posizionato. Il valore viene inserito senza alcun tipo o senza verificare la validità del nuovo valore in base al tipo del nodo se sono disponibili le informazioni sullo schema.

Nell'esempio seguente, il metodo SetValue viene utilizzato per aggiornare tutti gli elementi price nel file contosoBooks.xml.

Dim document As XmlDocument = New XmlDocument()
document.Load("contosoBooks.xml")
Dim navigator As XPathNavigator = document.CreateNavigator()

Dim manager As XmlNamespaceManager = New XmlNamespaceManager(navigator.NameTable)
manager.AddNamespace("bk", "https://www.contoso.com/books")

For Each nav As XPathNavigator In navigator.Select("//bk:price", manager)
    If nav.Value = "11.99" Then
        nav.SetValue("12.99")
    End If
Next

Console.WriteLine(navigator.OuterXml)
XmlDocument document = new XmlDocument();
document.Load("contosoBooks.xml");
XPathNavigator navigator = document.CreateNavigator();

XmlNamespaceManager manager = new XmlNamespaceManager(navigator.NameTable);
manager.AddNamespace("bk", "https://www.contoso.com/books");

foreach (XPathNavigator nav in navigator.Select("//bk:price", manager))
{
    if (nav.Value == "11.99")
    {
        nav.SetValue("12.99");
    }
}

Console.WriteLine(navigator.OuterXml);
XmlDocument^ document = gcnew XmlDocument();
document->Load("contosoBooks.xml");
XPathNavigator^ navigator = document->CreateNavigator();

XmlNamespaceManager^ manager = gcnew XmlNamespaceManager(navigator->NameTable);
manager->AddNamespace("bk", "https://www.contoso.com/books");

for each (XPathNavigator^ nav in navigator->Select("//bk:price", manager))
{
    if(nav->Value == "11.99")
    {
        nav->SetValue("12.99");
    }
}

Console::WriteLine(navigator->OuterXml);

Nell'esempio il file contosoBooks.xml viene considerato come input.

<?xml version="1.0" encoding="utf-8" ?>
<bookstore xmlns="https://www.contoso.com/books">
    <book genre="autobiography" publicationdate="1981-03-22" ISBN="1-861003-11-0">
        <title>The Autobiography of Benjamin Franklin</title>
        <author>
            <first-name>Benjamin</first-name>
            <last-name>Franklin</last-name>
        </author>
        <price>8.99</price>
    </book>
    <book genre="novel" publicationdate="1967-11-17" ISBN="0-201-63361-2">
        <title>The Confidence Man</title>
        <author>
            <first-name>Herman</first-name>
            <last-name>Melville</last-name>
        </author>
        <price>11.99</price>
    </book>
    <book genre="philosophy" publicationdate="1991-02-15" ISBN="1-861001-57-6">
        <title>The Gorgias</title>
        <author>
            <name>Plato</name>
        </author>
        <price>9.99</price>
    </book>
</bookstore>

Inserimento di valori tipizzati

Quando il tipo di un nodo è un tipo semplice W3C XML Schema, il nuovo valore inserito dal metodo SetTypedValue viene verificato in base ai facet del tipo semplice prima di impostare il valore. Se il nuovo valore non è valido in base al tipo del nodo (ad esempio l'impostazione di un valore -1 su un elemento il cui tipo è xs:positiveInteger), viene generata un'eccezione.

Nell'esempio seguente si tenta di modificare il valore dell'elemento price del primo elemento book nel file contosoBooks.xml in un valore DateTime. Poiché il tipo XML Schema dell'elemento price viene definito come xs:decimal nei file contosoBooks.xsd, viene generata un'eccezione.

Dim settings As XmlReaderSettings = New XmlReaderSettings()
settings.Schemas.Add("https://www.contoso.com/books", "contosoBooks.xsd")
settings.ValidationType = ValidationType.Schema

Dim reader As XmlReader = XmlReader.Create("contosoBooks.xml", settings)

Dim document As XmlDocument = New XmlDocument()
document.Load(reader)
Dim navigator As XPathNavigator = document.CreateNavigator()

navigator.MoveToChild("bookstore", "https://www.contoso.com/books")
navigator.MoveToChild("book", "https://www.contoso.com/books")
navigator.MoveToChild("price", "https://www.contoso.com/books")

navigator.SetTypedValue(DateTime.Now)
XmlReaderSettings settings = new XmlReaderSettings();
settings.Schemas.Add("https://www.contoso.com/books", "contosoBooks.xsd");
settings.ValidationType = ValidationType.Schema;

XmlReader reader = XmlReader.Create("contosoBooks.xml", settings);

XmlDocument document = new XmlDocument();
document.Load(reader);
XPathNavigator navigator = document.CreateNavigator();

navigator.MoveToChild("bookstore", "https://www.contoso.com/books");
navigator.MoveToChild("book", "https://www.contoso.com/books");
navigator.MoveToChild("price", "https://www.contoso.com/books");

navigator.SetTypedValue(DateTime.Now);

Nell'esempio il file contosoBooks.xml viene considerato come input.

<?xml version="1.0" encoding="utf-8" ?>
<bookstore xmlns="https://www.contoso.com/books">
    <book genre="autobiography" publicationdate="1981-03-22" ISBN="1-861003-11-0">
        <title>The Autobiography of Benjamin Franklin</title>
        <author>
            <first-name>Benjamin</first-name>
            <last-name>Franklin</last-name>
        </author>
        <price>8.99</price>
    </book>
    <book genre="novel" publicationdate="1967-11-17" ISBN="0-201-63361-2">
        <title>The Confidence Man</title>
        <author>
            <first-name>Herman</first-name>
            <last-name>Melville</last-name>
        </author>
        <price>11.99</price>
    </book>
    <book genre="philosophy" publicationdate="1991-02-15" ISBN="1-861001-57-6">
        <title>The Gorgias</title>
        <author>
            <name>Plato</name>
        </author>
        <price>9.99</price>
    </book>
</bookstore>

Nell'esempio anche il file contosoBooks.xsd viene considerato come input.

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="https://www.contoso.com/books" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="bookstore">
        <xs:complexType>
            <xs:sequence>
                <xs:element maxOccurs="unbounded" name="book">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="title" type="xs:string" />
                            <xs:element name="author">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element minOccurs="0" name="name" type="xs:string" />
                                        <xs:element minOccurs="0" name="first-name" type="xs:string" />
                                        <xs:element minOccurs="0" name="last-name" type="xs:string" />
                                    </xs:sequence>
                                </xs:complexType>
                            </xs:element>
                            <xs:element name="price" type="xs:decimal" />
                        </xs:sequence>
                        <xs:attribute name="genre" type="xs:string" use="required" />
                        <xs:attribute name="publicationdate" type="xs:date" use="required" />
                        <xs:attribute name="ISBN" type="xs:string" use="required" />
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

Proprietà InnerXml e OuterXml

Le proprietà InnerXml e OuterXml della classe XPathNavigator modificano il markup XML dei nodi su cui un oggetto XPathNavigator è attualmente posizionato.

La proprietà InnerXml consente di modificare il markup XML dei nodi figlio su cui è attualmente posizionato un oggetto XPathNavigator con il contenuto analizzato della string XML specificata. Allo stesso modo, la proprietà OuterXml consente di modificare il markup XML dei nodi figlio su cui è attualmente posizionato un oggetto XPathNavigator nonché il nodo corrente stesso.

Oltre ai metodi descritti in questo argomento, è possibile utilizzare le proprietà InnerXml e OuterXml per rimuovere nodi e valori da un documento XML. Per ulteriori informazioni sull'utilizzo delle proprietà InnerXml e OuterXml per l'inserimento di nodi e valori, vedere l'argomento Modifica dei dati XML con XPathNavigator.

Conflitti tra spazio dei nomi e xml:lang

Determinati conflitti relativi all'ambito dello spazio dei nomi e delle dichiarazioni xml:lang possono verificarsi quando si inseriscono i dati XML utilizzando i metodi InsertBefore, InsertAfter, AppendChild e PrependChild della classeXPathNavigator che accetta oggetti XmlReader come parametri.

Di seguito sono riportati alcuni tra i possibili conflitti tra gli spazi dei nomi.

  • Se viene rilevato uno spazio dei nomi nell'ambito del contesto dell'oggetto XmlReader, in cui il mapping del prefisso URI dello spazio dei nomi non si trova nel contesto dell'oggetto XPathNavigator, viene aggiunta una nuova dichiarazione dello spazio dei nomi al nuovo nodo inserito.

  • Se lo stesso URI dello spazio dei nomi si trova sia nell'ambito del contesto dell'oggetto XmlReader che nel contesto dell'oggetto XPathNavigator, ma con un diverso prefisso mappato in entrambi i contesti, viene aggiunta una nuova dichiarazione dello spazio dei nomi al nuovo nodo inserito, con prefisso e URI dello spazio dei nomi tratti dall'oggetto XmlReader.

  • Se lo stesso prefisso dello spazio dei nomi si trova sia nell'ambito del contesto dell'oggetto XmlReader che nel contesto dell'oggetto XPathNavigator, ma con un diverso URI dello spazio dei nomi mappato in entrambi i contesti, viene aggiunta una nuova dichiarazione dello spazio dei nomi al nuovo nodo inserito, che ridichiara il prefisso con l'URI dello spazio dei nomi tratto dall'oggetto XmlReader.

  • Se il prefisso e l'URI dello spazio dei nomi in entrambi i contesti dell'oggetto XmlReader e dell'oggetto XPathNavigator sono gli stessi, non viene aggiunta alcuna nuova dichiarazione dello spazio dei nomi al nuovo nodo inserito.

NotaNota

La descrizione precedente è valida anche per le dichiarazioni dello spazio dei nomi con la string vuota come prefisso (ad esempio la dichiarazione dello spazio dei nomi predefinita).

Di seguito sono riportati alcuni tra i possibili conflitti xml:lang.

  • Se viene rilevato un attributo xml:lang nell'ambito del contesto dell'oggetto XmlReader ma non nel contesto dell'oggetto XPathNavigator, viene aggiunto al nuovo nodo inserito un attributo xml:lang il cui valore viene tratto dall'oggetto XmlReader.

  • Se viene rilevato un attributo xml:lang sia nell'ambito del contesto dell'oggetto XmlReader che nel contesto dell'oggetto XPathNavigator, ma ciascuno con un valore diverso, viene aggiunto al nuovo nodo inserito un attributo xml:lang il cui valore viene tratto dall'oggetto XmlReader.

  • Se viene rilevato un attributo xml:lang sia nell'ambito del contesto dell'oggetto XmlReader che nel contesto dell'oggetto XPathNavigator, ma ciascuno con lo stesso valore, non viene aggiunto alcun nuovo attributo xml:lang al nodo appena inserito.

  • Se viene rilevato un attributo xml:lang nell'ambito del contesto dell'oggetto XPathNavigator ma non nel contesto dell'oggetto XmlReader, non viene aggiunto alcun attributo xml:lang al nuovo nodo inserito.

Inserimento di nodi con XmlWriter

I metodi utilizzati per inserire nodi di pari livello, nodi figlio e nodi Attribute descritti nella sezione "Inserimento di nodi e valori" sono in overload. I metodi InsertAfter, InsertBefore, AppendChild, PrependChild e CreateAttributes della classe XPathNavigator restituiscono un oggetto XmlWriter utilizzato per inserire i nodi.

Metodi XmlWriter non supportati

Non tutti i metodi utilizzati per scrivere le informazioni in un documento XML utilizzando la classe XmlWriter sono supportati dalla classe XPathNavigator a causa della differenza tra il modello dati XPath e il modello DOM (Document Object Model).

Nella tabella seguente vengono descritti i metodi della classe XmlWriter non supportati dalla classe XPathNavigator.

Metodo

Descrizione

WriteEntityRef

Genera un'eccezione NotSupportedException.

WriteDocType

Ignorato al livello radice e genera un'eccezione NotSupportedException se chiamato a qualsiasi altro livello nel documento XML.

WriteCData

Considerato come una chiamata al metodo WriteString per il carattere o i caratteri equivalenti.

WriteCharEntity

Considerato come una chiamata al metodo WriteString per il carattere o i caratteri equivalenti.

WriteSurrogateCharEntity

Considerato come una chiamata al metodo WriteString per il carattere o i caratteri equivalenti.

Per ulteriori informazioni sulla classe XmlWriter, vedere la documentazione di riferimento per la classe XmlWriter.

Più oggetti XmlWriter

È possibile disporre di più oggetti XPathNavigator che scelgono parti diverse di un documento XML con uno o più oggetti XmlWriter aperti. Sono consentiti e supportati più oggetti XmlWriter in scenari a thread singolo.

Di seguito sono riportate note importanti relative all'utilizzo di più oggetti XmlWriter.

  • I frammenti XML scritti dagli oggetti XmlWriter vengono aggiunti al documento XML quando viene chiamato il metodo Close di ciascun oggetto XmlWriter. Fino a quel punto, l'oggetto XmlWriter sta scrivendo un frammento disconnesso. Se viene eseguita un'operazione sul documento XML, i frammenti scritti da un oggetto XmlWriter prima che sia stato chiamato il metodo Close non sono interessati dall'operazione.

  • Se viene rilevato un oggetto XmlWriter aperto in un particolare sottoalbero XML che viene in seguito eliminato, l'oggetto XmlWriter può ancora essere aggiunto al sottoalbero. Il sottoalbero diviene semplicemente un frammento eliminato.

  • Se più oggetti XmlWriter vengono aperti nello stesso punto del documento XML, verranno aggiunti al documento XML in base all'ordine in cui gli oggettiXmlWriter sono stati chiusi, non nell'ordine in base al quale sono stati aperti.

Nell'esempio seguente viene creato un oggetto XmlDocument, quindi un oggetto XPathNavigator e infine viene utilizzato l'oggetto XmlWriter restituito dal metodo PrependChild per creare la struttura del primo libro nel file books.xml. L'oggetto viene quindi salvato come file book.xml.

Dim document As XmlDocument = New XmlDocument()
Dim navigator As XPathNavigator = document.CreateNavigator()

Using writer As XmlWriter = navigator.PrependChild()

    writer.WriteStartElement("bookstore")
    writer.WriteStartElement("book")
    writer.WriteAttributeString("genre", "autobiography")
    writer.WriteAttributeString("publicationdate", "1981-03-22")
    writer.WriteAttributeString("ISBN", "1-861003-11-0")
    writer.WriteElementString("title", "The Autobiography of Benjamin Franklin")
    writer.WriteStartElement("author")
    writer.WriteElementString("first-name", "Benjamin")
    writer.WriteElementString("last-name", "Franklin")
    writer.WriteElementString("price", "8.99")
    writer.WriteEndElement()
    writer.WriteEndElement()
    writer.WriteEndElement()

End Using

document.Save("book.xml")
XmlDocument document = new XmlDocument();
XPathNavigator navigator = document.CreateNavigator();

using (XmlWriter writer = navigator.PrependChild())
{
    writer.WriteStartElement("bookstore");
    writer.WriteStartElement("book");
    writer.WriteAttributeString("genre", "autobiography");
    writer.WriteAttributeString("publicationdate", "1981-03-22");
    writer.WriteAttributeString("ISBN", "1-861003-11-0");
    writer.WriteElementString("title", "The Autobiography of Benjamin Franklin");
    writer.WriteStartElement("author");
    writer.WriteElementString("first-name", "Benjamin");
    writer.WriteElementString("last-name", "Franklin");
    writer.WriteElementString("price", "8.99");
    writer.WriteEndElement();
    writer.WriteEndElement();
    writer.WriteEndElement();
}
document.Save("book.xml");

Salvataggio di un documento XML

Il salvataggio delle modifiche apportate a un oggetto XmlDocument come risultato dei metodi descritti in questo argomento viene eseguito utilizzando i metodi della classe XmlDocument. Per ulteriori informazioni sul salvataggio delle modifiche apportate a un oggetto XmlDocument, vedere Salvataggio e scrittura di un documento.

Vedere anche

Riferimenti

XmlDocument

XPathDocument

XPathNavigator

Concetti

Elaborazione di dati XML con il modello di dati XPath

Modifica dei dati XML con XPathNavigator

Rimozione di dati XML con XPathNavigator