Inserimento dei dati XML utilizzando XPathNavigatorInsert XML Data using 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.The XPathNavigator class provides a set of methods used to insert sibling, child, and attribute nodes in an XML document. Per usare questi metodi, è necessario che l'oggetto XPathNavigator sia modificabile, ovvero, la relativa proprietà CanEdit deve essere true.In order to use these methods, the XPathNavigator object must be editable, that is, its CanEdit property must be true.

Gli oggetti XPathNavigator che possono modificare un documento XML vengono creati dal metodo CreateNavigator della classe XmlDocument.XPathNavigator objects that can edit an XML document are created by the CreateNavigator method of the XmlDocument class. 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.XPathNavigator objects created by the XPathDocument class are read-only and any attempt to use the editing methods of an XPathNavigator object created by an XPathDocument object results in a NotSupportedException.

Per altre informazioni sulla creazioni di oggetti XPathNavigator modificabili, vedere Lettura di dati XML con XPathDocument e XmlDocument.For more information about creating editable XPathNavigator objects, see Reading XML Data using XPathDocument and XmlDocument.

Inserimento di nodiInserting Nodes

La classe XPathNavigator fornisce i metodi per inserire nodi di pari livello, nodi figlio e nodi Attribute in un documento XML.The XPathNavigator class provides methods to insert sibling, child, and attribute nodes in an XML document. 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.These methods allow you to insert nodes and attributes in different locations in relation to the current position of an XPathNavigator object and are described in the following sections.

Inserimento di nodi di pari livelloInserting Sibling Nodes

La classe XPathNavigator fornisce i seguenti metodi per inserire nodi di pari livello.The XPathNavigator class provides the following methods to insert sibling nodes.

Tali metodi consentono di inserire nodi di pari livello prima e dopo il nodo su cui l'oggetto XPathNavigator è attualmente posizionato.These methods insert sibling nodes before and after the node an XPathNavigator object is currently positioned on.

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.The InsertAfter and InsertBefore methods are overloaded and accept a string, XmlReader object, or XPathNavigator object containing the sibling node to add as parameters. Entrambi i metodi restituiscono inoltre un oggetto XmlWriter usato per inserire i nodi di pari livello.Both methods also return an XmlWriter object used to insert sibling nodes.

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.The InsertElementAfter and InsertElementBefore methods insert a single sibling node before and after the node an XPathNavigator object is currently positioned on using the namespace prefix, local name, namespace URI, and value specified as parameters.

Nell'esempio seguente viene inserito un nuovo elemento pages prima dell'elemento figlio price del primo elemento book nel file contosoBooks.xml.In the following example a new pages element is inserted before the price child element of the first book element in the contosoBooks.xml file.

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.The example takes the contosoBooks.xml file as an 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.For more information about the InsertAfter, InsertBefore, InsertElementAfter and InsertElementBefore methods, see the XPathNavigator class reference documentation.

Inserimento di nodi figlioInserting Child Nodes

La classe XPathNavigator fornisce i seguenti metodi per inserire nodi figlio.The XPathNavigator class provides the following methods to insert child nodes.

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.These methods append and prepend child nodes to the end of and the beginning of the list of child nodes of the node an XPathNavigator object is currently positioned on.

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.Like the methods in the "Inserting Sibling Nodes" section, the AppendChild and PrependChild methods accept a string, XmlReader object, or XPathNavigator object containing the child node to add as parameters. Entrambi i metodi restituiscono inoltre un oggetto XmlWriter usato per inserire i nodi figlio.Both methods also return an XmlWriter object used to insert child nodes.

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.Also like the methods in the "Inserting Sibling Nodes" section, the AppendChildElement and PrependChildElement methods insert a single child node to the end of and the beginning of the list of child nodes of the node an XPathNavigator object is currently positioned on using the namespace prefix, local name, namespace URI, and value specified as parameters.

Nell'esempio seguente, viene aggiunto un nuovo elemento figlio pages all'elenco degli elementi figlio del primo elemento book nel file contosoBooks.xml.In the following example, a new pages child element is appended to the list of child elements of the first book element in the contosoBooks.xml file.

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.The example takes the contosoBooks.xml file as an 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.For more information about the AppendChild, PrependChild, AppendChildElement and PrependChildElement methods, see the XPathNavigator class reference documentation.

Inserimento di nodi AttributeInserting Attribute Nodes

La classe XPathNavigator fornisce i seguenti metodi per inserire nodi Attribute.The XPathNavigator class provides the following methods to insert attribute nodes.

Tali metodi consentono di inserire nodi Attribute sul nodo di tipo element su cui un oggetto XPathNavigator è attualmente posizionato.These methods insert attribute nodes on the element node an XPathNavigator object is currently positioned on. 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.The CreateAttribute method creates an attribute node on the element node an XPathNavigator object is currently positioned on using the namespace prefix, local name, namespace URI, and value specified as parameters. Il metodo CreateAttributes restituisce un oggetto XmlWriter usato per inserire i nodi Attribute.The CreateAttributes method returns an XmlWriter object used to insert attribute nodes.

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.In the following example, new discount and currency attributes are created on the price child element of the first book element in the contosoBooks.xml file using the XmlWriter object returned from the CreateAttributes method.

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.The example takes the contosoBooks.xml file as an 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.For more information about the CreateAttribute and CreateAttributes methods, see the XPathNavigator class reference documentation.

Copia di nodiCopying Nodes

In alcuni casi può essere necessario compilare un documento XML con il contenuto di un altro documento XML.In certain cases you may want to populate an XML document with the contents from another XML document. 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.Both the XPathNavigator class and the XmlWriter class can copy nodes to an XmlDocument object from an existing XmlReader object or XPathNavigator object.

Gli overload dei metodi AppendChild, PrependChild, InsertBefore e InsertAfter della classe XPathNavigator accettano tutti un oggetto XPathNavigator o un oggetto XmlReader come parametro.The AppendChild, PrependChild, InsertBefore and InsertAfter methods of the XPathNavigator class all have overloads that can accept an XPathNavigator object or an XmlReader object as a parameter.

Gli overload del metodo WriteNode della classe XmlWriter possono accettare un oggetto XmlNode, XmlReader o XPathNavigator.The WriteNode method of the XmlWriter class has overloads that can accept an XmlNode, XmlReader, or XPathNavigator object.

Nell'esempio seguente tutti gli elementi book vengono copiati da un documento all'altro.The following example copies all the book elements from one document to another.

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 valoriInserting Values

La classe XPathNavigator fornisce i metodi SetValue e SetTypedValue per inserire i valori di un nodo in un oggetto XmlDocument.The XPathNavigator class provides the SetValue and SetTypedValue methods to insert values for a node into an XmlDocument object.

Inserimento di valori non tipizzatiInserting Untyped Values

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.The SetValue method simply inserts the untyped string value passed as a parameter as the value of the node the XPathNavigator object is currently positioned on. 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.The value is inserted without any type or without verifying that the new value is valid according to the type of the node if schema information is available.

Nell'esempio seguente, il metodo SetValue viene usato per aggiornare tutti gli elementi price nel file contosoBooks.xml.In the following example, the SetValue method is used to update all price elements in the contosoBooks.xml file.

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.The example takes the contosoBooks.xml file as an 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 tipizzatiInserting Typed Values

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.When the type of a node is a W3C XML Schema simple type, the new value inserted by the SetTypedValue method is checked against the facets of the simple type before the value is set. 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.If the new value is not valid according to the type of the node (for example, setting a value of -1 on an element whose type is xs:positiveInteger), it results in an exception.

Nell'esempio seguente si tenta di modificare il valore dell'elemento price del primo elemento book nel file contosoBooks.xml in un valore DateTime.The following example attempts to change the value of the price element of the first book element in the contosoBooks.xml file to a DateTime value. Poiché il tipo XML Schema dell'elemento price viene definito come xs:decimal nei file contosoBooks.xsd, viene generata un'eccezione.Because the XML Schema type of the price element is defined as xs:decimal in the contosoBooks.xsd files, this results in an exception.

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.The example takes the contosoBooks.xml file as an 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.The example also takes the contosoBooks.xsd as an 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 OuterXmlThe InnerXml and OuterXml Properties

Le proprietà InnerXml e OuterXml della classe XPathNavigator consentono di modificare il markup XML dei nodi su cui è attualmente posizionato un oggetto XPathNavigator.The InnerXml and OuterXml properties of the XPathNavigator class change the XML markup of the nodes an XPathNavigator object is currently positioned on.

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.The InnerXml property changes the XML markup of the child nodes an XPathNavigator object is currently positioned on with the parsed contents of the given XML string. 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.Similarly, the OuterXml property changes the XML markup of the child nodes an XPathNavigator object is currently positioned on as well as the current node itself.

Oltre ai metodi descritti in questo argomento, è possibile usare le proprietà InnerXml e OuterXml per rimuovere nodi e valori da un documento XML.In addition to the methods described in this topic, the InnerXml and OuterXml properties can be used to insert nodes and values in an XML document. Per altre informazioni sull'uso delle proprietà InnerXml e OuterXml per inserire nodi e valori, vedere l'argomento Modificare dati XML con XPathNavigator.For more information about using the InnerXml and OuterXml properties to insert nodes and values, see the Modify XML Data using XPathNavigator topic.

Conflitti tra spazio dei nomi e xml:langNamespace and xml:lang Conflicts

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.Certain conflicts related to the scope of namespace and xml:lang declarations can occur when inserting XML data using the InsertBefore, InsertAfter, AppendChild and PrependChild methods of the XPathNavigator class that take XmlReader objects as parameters.

Di seguito sono riportati alcuni tra i possibili conflitti tra gli spazi dei nomi.The following are the possible namespace conflicts.

  • 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.If there is a namespace in-scope within the XmlReader object's context, where the prefix to namespace URI mapping is not in the XPathNavigator object's context, a new namespace declaration is added to the newly inserted node.

  • 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.If the same namespace URI is in-scope within both the XmlReader object's context and the XPathNavigator object's context, but has a different prefix mapped to it in both contexts, a new namespace declaration is added to the newly inserted node, with the prefix and namespace URI taken from the XmlReader object.

  • 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.If the same namespace prefix is in-scope within both the XmlReader object's context and the XPathNavigator object's context, but has a different namespace URI mapped to it in both contexts, a new namespace declaration is added to the newly inserted node which re-declares that prefix with the namespace URI taken from XmlReader object.

  • 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.If the prefix as well as the namespace URI in both the XmlReader object's context and the XPathNavigator object's context is the same, no new namespace declaration is added to the newly inserted node.

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).The description above also applies to namespace declarations with the empty string as a prefix (for example, the default namespace declaration).

Di seguito sono riportati alcuni tra i possibili conflitti xml:lang.The following are the possible xml:lang conflicts.

  • 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.If there is an xml:lang attribute in-scope within the XmlReader object's context but not in the XPathNavigator object's context, an xml:lang attribute whose value is taken from the XmlReader object is added to the newly inserted node.

  • 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.If there is an xml:lang attribute in-scope within both the XmlReader object's context and the XPathNavigator object's context, but each has a different value, an xml:lang attribute whose value is taken from the XmlReader object is added to the newly inserted node.

  • 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.If there is an xml:lang attribute in-scope within both the XmlReader object's context and the XPathNavigator object's context, but each with the same value, no new xml:lang attribute is added on the newly inserted node.

  • 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.If there is an xml:lang attribute in-scope within the XPathNavigator object's context, but none existing in the XmlReader object's context, no xml:lang attribute is added to the newly inserted node.

Inserimento di nodi con XmlWriterInserting Nodes with 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.The methods used to insert sibling, child and attribute nodes described in the "Inserting Nodes and Values" section are overloaded. I metodi InsertAfter, InsertBefore, AppendChild, PrependChild e CreateAttributes della classe XPathNavigator restituiscono un oggetto XmlWriter usato per inserire i nodi.The InsertAfter, InsertBefore, AppendChild, PrependChild and CreateAttributes methods of the XPathNavigator class return an XmlWriter object used to insert nodes.

Metodi XmlWriter non supportatiUnsupported XmlWriter Methods

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).Not all of the methods used for writing information to an XML document using the XmlWriter class are supported by the XPathNavigator class due to difference between the XPath data model and the Document Object Model (DOM).

Nella tabella seguente vengono descritti i metodi della classe XmlWriter non supportati dalla classe XPathNavigator.The following table describes the XmlWriter class methods not supported by the XPathNavigator class.

MetodoMethod DescrizioneDescription
WriteEntityRef Genera un'eccezione NotSupportedException.Throws a NotSupportedException exception.
WriteDocType Ignorato al livello radice e genera un'eccezione NotSupportedException se chiamato a qualsiasi altro livello nel documento XML.Ignored at the root level and throws a NotSupportedException exception if called at any other level in the XML document.
WriteCData Considerato come una chiamata al metodo WriteString per il carattere o i caratteri equivalenti.Treated as a call to the WriteString method for the equivalent character or characters.
WriteCharEntity Considerato come una chiamata al metodo WriteString per il carattere o i caratteri equivalenti.Treated as a call to the WriteString method for the equivalent character or characters.
WriteSurrogateCharEntity Considerato come una chiamata al metodo WriteString per il carattere o i caratteri equivalenti.Treated as a call to the WriteString method for the equivalent character or characters.

Per altre informazioni sulla classe XmlWriter, vedere la documentazione di riferimento per la classe XmlWriter.For more information about the XmlWriter class, see the XmlWriter class reference documentation.

Più oggetti XmlWriterMultiple XmlWriter Objects

È possibile disporre di più oggetti XPathNavigator che scelgono parti diverse di un documento XML con uno o più oggetti XmlWriter aperti.It is possible to have multiple XPathNavigator objects pointing to different parts of an XML document with one or more open XmlWriter objects. Sono consentiti e supportati più oggetti XmlWriter in scenari a thread singolo.Multiple XmlWriter objects are allowed and supported in single-threaded scenarios.

Di seguito sono riportate note importanti relative all'utilizzo di più oggetti XmlWriter.The following are important notes to consider when using multiple XmlWriter objects.

  • I frammenti XML scritti dagli oggetti XmlWriter vengono aggiunti al documento XML quando viene chiamato il metodo Close di ciascun oggetto XmlWriter.XML fragments written by XmlWriter objects are added to the XML document when the Close method of each XmlWriter object is called. Fino a quel punto, l'oggetto XmlWriter sta scrivendo un frammento disconnesso.Until that point, the XmlWriter object is writing a disconnected fragment. 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.If an operation is performed on the XML document, any fragments being written by an XmlWriter object, before the Close has been called, are not affected.

  • 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.If there is an open XmlWriter object on a particular XML subtree and that subtree is deleted, the XmlWriter object may still add to the sub-tree. Il sottoalbero diviene semplicemente un frammento eliminato.The subtree simply becomes a deleted fragment.

  • 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.If multiple XmlWriter objects are opened at the same point in the XML document, they are added to the XML document in the order in which the XmlWriter objects are closed, not in the order in which they were opened.

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.The following example creates an XmlDocument object, creates an XPathNavigator object, and then uses the XmlWriter object returned by the PrependChild method to create the structure of the first book in the books.xml file. L'oggetto viene quindi salvato come file book.xml.The example then saves it as the 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 XMLSaving an XML Document

Il salvataggio delle modifiche apportate a un oggetto XmlDocument mediante i metodi descritti in questo argomento viene eseguito usando i metodi della classe XmlDocument.Saving changes made to an XmlDocument object as the result of the methods described in this topic is performed using the methods of the XmlDocument class. Per altre informazioni sul salvataggio delle modifiche apportate a un oggetto XmlDocument, vedere Salvataggio e scrittura di un documento.For more information about saving changes made to an XmlDocument object, see Saving and Writing a Document.

Vedere ancheSee Also

XmlDocument
XPathDocument
XPathNavigator
Elaborazione di dati XML con il modello di dati XPathProcess XML Data Using the XPath Data Model
Modificare dati XML con XPathNavigatorModify XML Data using XPathNavigator
Rimuovere dati XML con XPathNavigatorRemove XML Data using XPathNavigator