Condividi tramite


Inserire dati XML con XPathNavigator

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

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

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

Inserimento di nodi

La classe XPathNavigator fornisce metodi per inserire nodi fratelli, figli e attributi in un documento XML. Questi metodi consentono di inserire nodi e attributi in posizioni diverse in relazione alla posizione corrente di un XPathNavigator oggetto e sono descritti nelle sezioni seguenti.

Inserimento di nodi di pari livello

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

Questi metodi inseriscono nodi di pari livello prima e dopo il nodo XPathNavigator in cui un oggetto è attualmente posizionato.

I InsertAfter metodi e InsertBefore vengono sovraccaricati e accettano un stringoggetto , XmlReader o XPathNavigator un oggetto contenente il nodo di pari livello da aggiungere come parametri. Entrambi i metodi restituiscono anche un XmlWriter oggetto utilizzato per inserire nodi di pari livello.

I InsertElementAfter metodi e InsertElementBefore inseriscono un singolo nodo di pari livello prima e dopo il nodo in cui un XPathNavigator oggetto è attualmente posizionato usando il prefisso dello spazio dei nomi, il nome locale, l'URI dello spazio dei nomi e il valore specificati come parametri.

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

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)

L'esempio accetta il contosoBooks.xml file 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 InsertAftermetodi , InsertBeforeInsertElementAfter e InsertElementBefore , vedere la documentazione di riferimento sulla XPathNavigator classe.

Inserimento di nodi figlio

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

Questi metodi aggiungono e anteponono nodi figlio alla fine di e l'inizio dell'elenco dei nodi figlio del nodo su cui è attualmente posizionato un XPathNavigator oggetto.

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

Analogamente ai metodi nella sezione "Inserimento di nodi di pari livello", i AppendChildElement metodi e PrependChildElement inseriscono un singolo nodo figlio alla fine di e l'inizio dell'elenco di nodi figlio del nodo in cui un XPathNavigator oggetto è attualmente posizionato usando il prefisso dello spazio dei nomi, il nome locale, l'URI dello spazio dei nomi e il valore specificati come parametri.

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

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)

L'esempio accetta il contosoBooks.xml file 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 AppendChildmetodi , PrependChildAppendChildElement e PrependChildElement , vedere la documentazione di riferimento sulla XPathNavigator classe.

Inserimento di nodi attributo

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

Questi metodi inseriscono nodi di attributo nel nodo dell'elemento in cui un XPathNavigator oggetto è attualmente posizionato. Il metodo CreateAttribute crea un nodo attributo nel nodo dell'elemento su cui un oggetto XPathNavigator è posizionato attualmente, utilizzando il prefisso dello spazio dei nomi, il nome locale, l'URI dello spazio dei nomi e il valore specificati come parametri. Il CreateAttributes metodo restituisce un XmlWriter oggetto utilizzato per inserire nodi di attributo.

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

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)

L'esempio accetta il contosoBooks.xml file 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 ulteriori informazioni sui metodi CreateAttribute e CreateAttributes, consultare la documentazione di riferimento della classe XPathNavigator.

Copiare i nodi

In alcuni casi può essere necessario popolare un documento XML con il contenuto di un altro documento XML. Sia la XPathNavigator classe che la XmlWriter classe possono copiare nodi in un oggetto XmlDocument da un oggetto esistente XmlReader o XPathNavigator.

I metodi AppendChild, PrependChild, InsertBefore e InsertAfter della classe XPathNavigator hanno tutti sovraccarichi che possono accettare un oggetto XPathNavigator o un oggetto XmlReader come parametro.

Il metodo WriteNode della classe XmlWriter ha overload che può accettare un oggetto XmlNode, XmlReader o XPathNavigator.

Nell'esempio seguente vengono copiati tutti gli book elementi da un documento a un 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 di valori

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

Inserimento di valori non tipizzati

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

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

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)

L'esempio accetta il contosoBooks.xml file 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 W3C XML Schema, il nuovo valore inserito dal SetTypedValue metodo viene controllato rispetto ai facet del tipo semplice prima che il valore venga impostato. Se il nuovo valore non è valido in base al tipo del nodo ( ad esempio, impostando un valore su -1 un elemento il cui tipo è xs:positiveInteger), viene generata un'eccezione.

Nell'esempio seguente si tenta di modificare il valore del primo elemento price dell'elemento book nel file contosoBooks.xml in un valore DateTime. Poiché il tipo xml Schema dell'elemento price è definito come xs:decimal nei contosoBooks.xsd file, 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);

L'esempio accetta il contosoBooks.xml file 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>

L'esempio accetta anche contosoBooks.xsd 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 ed OuterXml

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

La InnerXml proprietà modifica il markup XML dei nodi figlio in cui un XPathNavigator oggetto è attualmente posizionato con il contenuto analizzato del codice XML stringspecificato. Analogamente, la OuterXml proprietà modifica il markup XML dei nodi figlio in cui un XPathNavigator oggetto è attualmente posizionato e il nodo corrente stesso.

Oltre ai metodi descritti in questo argomento, è possibile utilizzare le InnerXml proprietà e OuterXml per inserire nodi e valori in un documento XML. Per altre informazioni sull'uso delle InnerXml proprietà e OuterXml per inserire nodi e valori, vedere l'argomento Modify XML Data using XPathNavigator .

Conflitti tra spazio dei nomi e xml:lang

Alcuni conflitti correlati all'ambito dello spazio dei nomi e delle dichiarazioni possono verificarsi quando si inseriscono dati XML usando i metodi xml:lang, InsertBefore, InsertAfter e AppendChild della classe PrependChild che prendono oggetti XPathNavigator come parametri.

Di seguito sono riportati i possibili conflitti di namespace.

  • Se è presente uno spazio dei nomi nell'ambito del contesto dell'oggetto XmlReader, dove la mappatura dal prefisso all'URI dello spazio dei nomi non si trova nel contesto dell'oggetto XPathNavigator, viene aggiunta una nuova dichiarazione dello spazio dei nomi al nodo appena inserito.

  • Se lo stesso URI dello spazio dei nomi è incluso nell'ambito sia nel contesto dell'oggetto XmlReader sia nel contesto dell'oggetto XPathNavigator, ma ha un prefisso diverso mappato in entrambi i contesti, viene aggiunta una nuova dichiarazione di uno spazio dei nomi al nodo appena inserito, con il prefisso e l'URI dello spazio dei nomi tratti dall'oggetto XmlReader.

  • Se lo stesso prefisso dello spazio dei nomi è nell'ambito sia nel contesto dell'oggetto XmlReader che nel contesto dell'oggetto XPathNavigator, ma con un URI dello spazio dei nomi diverso mappato in entrambi i contesti, al nuovo nodo inserito viene aggiunta una nuova dichiarazione di spazio dei nomi che rideclara quel prefisso con l'URI dello spazio dei nomi preso dall'oggetto XmlReader.

  • Se il prefisso e l'URI dello spazio dei nomi sia nel XmlReader contesto dell'oggetto che nel XPathNavigator contesto dell'oggetto sono uguali, non viene aggiunta alcuna nuova dichiarazione dello spazio dei nomi al nodo appena inserito.

Annotazioni

La descrizione precedente si applica anche alle dichiarazioni dello spazio dei nomi con il prefisso vuoto string , ad esempio la dichiarazione dello spazio dei nomi predefinita.

Di seguito sono riportati i possibili xml:lang conflitti.

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

  • Se è presente un xml:lang attributo nell'ambito sia del contesto dell'oggetto XmlReader che del contesto dell'oggetto XPathNavigator, ma ognuno ha un valore diverso, un xml:lang attributo il cui valore viene ricavato dall'oggetto XmlReader viene aggiunto al nodo appena inserito.

  • Se c'è un attributo xml:lang nell'ambito del contesto dell'oggetto XmlReader e nel contesto dell'oggetto XPathNavigator, ma entrambi con lo stesso valore, non viene aggiunto alcun nuovo attributo xml:lang sul nodo appena inserito.

  • Se è presente un attributo xml:lang nel contesto dell'oggetto XPathNavigator, ma assente nel contesto dell'oggetto XmlReader, non viene aggiunto alcun attributo xml:lang al nodo appena inserito.

Inserimento di nodi con XmlWriter

I metodi usati per inserire nodi di pari livello, figlio e attributo descritti nella sezione "Inserimento di nodi e valori" sono sovraccaricati. I InsertAftermetodi , InsertBefore, AppendChilde PrependChildCreateAttributes della XPathNavigator classe restituiscono un XmlWriter oggetto utilizzato per inserire nodi.

Metodi XmlWriter non supportati

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

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

Metodo Descrizione
WriteEntityRef Genera un'eccezione NotSupportedException .
WriteDocType Ignorato a livello radice e genera un'eccezione NotSupportedException se viene chiamato a qualsiasi altro livello del documento XML.
WriteCData Trattato come una chiamata al metodo WriteString per il carattere o i caratteri equivalenti.
WriteCharEntity Trattato come una chiamata al metodo WriteString per il carattere o i caratteri equivalenti.
WriteSurrogateCharEntity Trattato come una chiamata al metodo WriteString per il carattere o i caratteri equivalenti.

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

Più oggetti XmlWriter

È possibile avere più XPathNavigator oggetti che puntano a parti diverse di un documento XML con uno o più oggetti aperti XmlWriter . Più XmlWriter oggetti sono consentiti e supportati in scenari a thread singolo.

Di seguito sono riportate note importanti da considerare quando si usano più XmlWriter oggetti.

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

  • Se è presente un oggetto aperto XmlWriter in un particolare sottoalbero XML e tale sottoalbero viene eliminato, l'oggetto XmlWriter può comunque aggiungere al sottoalbero. Il sottoalbero diventa semplicemente un frammento eliminato.

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

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

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 XmlDocument oggetto come risultato dei metodi descritti in questo argomento viene eseguito usando i metodi della XmlDocument classe . Per altre informazioni sul salvataggio delle modifiche apportate a un XmlDocument oggetto, vedere Salvataggio e scrittura di un documento.

Vedere anche