Inserimento dei dati XML utilizzando XPathNavigator

La classe XPathNavigator fornisce un set di metodi usati per inserire nodi di pari livello, nodi figlio e nodi Attribute in un documento XML. Per usare questi metodi, è necessario che l'oggetto XPathNavigator sia modificabile, ovvero, la relativa proprietà 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 usare i metodi di modifica di un oggetto XPathNavigator creato da un oggetto XPathDocument genererà un oggetto NotSupportedException.

Per altre informazioni sulla creazioni 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 usato 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 usando 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.

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

navigator->MoveToChild("bookstore", "http://www.contoso.com/books");
navigator->MoveToChild("book", "http://www.contoso.com/books");
navigator->MoveToChild("price", "http://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", "http://www.contoso.com/books");
navigator.MoveToChild("book", "http://www.contoso.com/books");
navigator.MoveToChild("price", "http://www.contoso.com/books");

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

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

navigator.MoveToChild("bookstore", "http://www.contoso.com/books")
navigator.MoveToChild("book", "http://www.contoso.com/books")
navigator.MoveToChild("price", "http://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="http://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 altre 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 usato 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 usando 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.

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

navigator->MoveToChild("bookstore", "http://www.contoso.com/books");
navigator->MoveToChild("book", "http://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", "http://www.contoso.com/books");
navigator.MoveToChild("book", "http://www.contoso.com/books");

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

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

navigator.MoveToChild("bookstore", "http://www.contoso.com/books")
navigator.MoveToChild("book", "http://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="http://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 altre 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 usando 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 usato 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 usando l'oggetto XmlWriter restituito dal metodo CreateAttributes.

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

navigator->MoveToChild("bookstore", "http://www.contoso.com/books");
navigator->MoveToChild("book", "http://www.contoso.com/books");
navigator->MoveToChild("price", "http://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 = new XmlDocument();
document.Load("contosoBooks.xml");
XPathNavigator navigator = document.CreateNavigator();

navigator.MoveToChild("bookstore", "http://www.contoso.com/books");
navigator.MoveToChild("book", "http://www.contoso.com/books");
navigator.MoveToChild("price", "http://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);
Dim document As XmlDocument = New XmlDocument()
document.Load("contosoBooks.xml")
Dim navigator As XPathNavigator = document.CreateNavigator()

navigator.MoveToChild("bookstore", "http://www.contoso.com/books")
navigator.MoveToChild("book", "http://www.contoso.com/books")
navigator.MoveToChild("price", "http://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)

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

<?xml version="1.0" encoding="utf-8" ?>
<bookstore xmlns="http://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 altre 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 consente semplicemente di inserire il valore non tipizzato string, passato come parametro, come valore del nodo su cui è attualmente posizionato l'oggetto XPathNavigator. 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 usato per aggiornare tutti gli elementi price nel file contosoBooks.xml.

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

XmlNamespaceManager^ manager = gcnew XmlNamespaceManager(navigator->NameTable);
manager->AddNamespace("bk", "http://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);
XmlDocument document = new XmlDocument();
document.Load("contosoBooks.xml");
XPathNavigator navigator = document.CreateNavigator();

XmlNamespaceManager manager = new XmlNamespaceManager(navigator.NameTable);
manager.AddNamespace("bk", "http://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);
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", "http://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)

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

<?xml version="1.0" encoding="utf-8" ?>
<bookstore xmlns="http://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 di W3C XML Schema, il nuovo valore inserito tramite il metodo SetTypedValue viene controllato rispetto ai facet del tipo semplice prima dell'impostazione del 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("http://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", "http://www.contoso.com/books")  
navigator.MoveToChild("book", "http://www.contoso.com/books")  
navigator.MoveToChild("price", "http://www.contoso.com/books")  
  
navigator.SetTypedValue(DateTime.Now)  
XmlReaderSettings settings = new XmlReaderSettings();  
settings.Schemas.Add("http://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", "http://www.contoso.com/books");  
navigator.MoveToChild("book", "http://www.contoso.com/books");  
navigator.MoveToChild("price", "http://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="http://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>

Anche il file contosoBooks.xsd viene considerato come input.

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://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 consentono di modificare il markup XML dei nodi su cui è attualmente posizionato un oggetto XPathNavigator.

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 usare le proprietà InnerXml e OuterXml per rimuovere nodi e valori da un documento XML. Per altre informazioni sull'uso delle proprietà InnerXml e OuterXml per inserire nodi e valori, vedere l'argomento Modificare 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 usando 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.

Nota

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 usati 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 usato per inserire i nodi.

Metodi XmlWriter non supportati

Non tutti i metodi usati per scrivere le informazioni in un documento XML usando 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 altre 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 usato 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 mediante i metodi descritti in questo argomento viene eseguito usando i metodi della classe XmlDocument. Per altre informazioni sul salvataggio delle modifiche apportate a un oggetto XmlDocument, vedere Salvataggio e scrittura di un documento.

Vedi anche