Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
La XPathNavigator classe fornisce un set di metodi utilizzati per modificare nodi e valori 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 comporta un oggetto NotSupportedException.
Per altre informazioni sulla creazione di oggetti modificabili XPathNavigator , vedere Lettura di dati XML tramite XPathDocument e XmlDocument.
Modifica dei nodi
Una tecnica semplice per modificare il valore di un nodo consiste nell'usare i SetValue metodi e SetTypedValue della XPathNavigator classe .
Nella tabella seguente sono elencati gli effetti di questi metodi su tipi di nodo diversi.
XPathNodeType | Dati modificati |
---|---|
Root | Non supportato. |
Element | Contenuto dell'elemento. |
Attribute | Valore dell'attributo. |
Text | Contenuto di testo. |
ProcessingInstruction | Contenuto, escluso la destinazione. |
Comment | Contenuto del commento. |
Namespace | Non supportato. |
La XPathNavigator classe fornisce anche un set di metodi usati per inserire e rimuovere nodi. Per ulteriori informazioni sull'inserimento e la rimozione di nodi da un documento XML, consultare gli argomenti Insert XML Data using XPathNavigator e Remove XML Data using XPathNavigator.
Modifica 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>
Modifica dei 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>
Effetti della modifica di dati XML fortemente tipizzati
La XPathNavigator classe utilizza lo "Schema XML W3C" come base per descrivere XML con tipizzazione forte. Gli elementi e gli attributi possono essere annotati con informazioni sul tipo in base alla convalida rispetto a un documento xml Schema W3C. Gli elementi che possono contenere altri elementi o attributi sono chiamati tipi complessi, mentre quelli che possono contenere solo contenuto testuale sono chiamati tipi semplici.
Annotazioni
Gli attributi possono avere solo tipi semplici.
Un elemento o un attributo può essere considerato valido per lo schema se è conforme a tutte le regole specifiche per la definizione del tipo. Un elemento con tipo semplice xs:int
deve contenere un valore numerico tra -2147483648 e 2147483647 per essere valido per lo schema. Per i tipi complessi, la validità dello schema dell'elemento dipende dalla validità dello schema dei relativi elementi e attributi figlio. Pertanto, se un elemento è valido rispetto alla definizione di tipo complesso, tutti gli elementi figlio e gli attributi sono validi rispetto alle definizioni dei tipi. Analogamente, se anche uno degli attributi o degli elementi figlio di un elemento non è valido per la definizione del tipo o ha una validità sconosciuta, l'elemento non è valido o di validità sconosciuta.
Dato che la validità di un elemento dipende dalla validità degli elementi e degli attributi figlio, le modifiche apportate determinano la modifica della validità dell'elemento se in precedenza era valida. In particolare, se gli elementi figlio o gli attributi di un elemento vengono inseriti, aggiornati o eliminati, la validità dell'elemento diventa sconosciuta. La proprietà Validity è rappresentata dal fatto che la proprietà SchemaInfo dell'elemento è impostata su NotKnown. Inoltre, questo effetto si estende verso l'alto in modo ricorsivo nel documento XML, perché anche la validità dell'elemento padre dell'elemento (e del relativo elemento padre e così via) diventa sconosciuta.
Per altre informazioni sulla convalida dello schema e sulla XPathNavigator classe , vedere Convalida dello schema tramite XPathNavigator.
Modifica degli attributi
I metodi SetValue e SetTypedValue possono essere usati per modificare sia i nodi di attributo tipati che quelli non tipati, così come gli altri tipi di nodo elencati nella sezione "Modifica dei nodi".
Nell'esempio seguente viene modificato il valore dell'attributo genre
del primo book
elemento nel books.xml
file.
Dim document As XmlDocument = New XmlDocument()
document.Load("books.xml")
Dim navigator As XPathNavigator = document.CreateNavigator()
navigator.MoveToChild("bookstore", String.Empty)
navigator.MoveToChild("book", String.Empty)
navigator.MoveToAttribute("genre", String.Empty)
navigator.SetValue("non-fiction")
navigator.MoveToRoot()
Console.WriteLine(navigator.OuterXml)
XmlDocument document = new XmlDocument();
document.Load("books.xml");
XPathNavigator navigator = document.CreateNavigator();
navigator.MoveToChild("bookstore", String.Empty);
navigator.MoveToChild("book", String.Empty);
navigator.MoveToAttribute("genre", String.Empty);
navigator.SetValue("non-fiction");
navigator.MoveToRoot();
Console.WriteLine(navigator.OuterXml);
Per altre informazioni sui SetValue metodi e SetTypedValue , vedere le sezioni "Modifica di valori non tipizzati" e "Modifica dei valori tipizzati".
Proprietà InnerXml e 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 string
specificato. Analogamente, la OuterXml proprietà modifica il markup XML dei nodi figlio in cui un XPathNavigator oggetto è attualmente posizionato e il nodo corrente stesso.
Nell'esempio seguente viene utilizzata la OuterXml proprietà per modificare il valore dell'elemento price
e inserire un nuovo discount
attributo sul primo book
elemento del contosoBooks.xml
file.
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.OuterXml = "<price discount=\"0\">10.99</price>"
navigator.MoveToRoot()
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.OuterXml = "<price discount=\"0\">10.99</price>";
navigator.MoveToRoot();
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>
Modifica dei nodi dello spazio dei nomi
Nel DOM (Document Object Model), le dichiarazioni dello spazio dei nomi vengono considerate come se fossero attributi regolari che possono essere inseriti, aggiornati ed eliminati. La XPathNavigator classe non consente tali operazioni sui nodi dello spazio dei nomi perché la modifica del valore di un nodo dello spazio dei nomi può modificare l'identità degli elementi e degli attributi all'interno dell'ambito del nodo dello spazio dei nomi, come illustrato nell'esempio seguente.
<root xmlns="http://www.contoso.com">
<child />
</root>
Se l'esempio XML precedente viene modificato nel modo seguente, questo rinomina in modo efficace ogni elemento del documento perché il valore dell'URI dello spazio dei nomi di ogni elemento viene modificato.
<root xmlns="urn:contoso.com">
<child />
</root>
L'inserimento di nodi dello spazio dei nomi che non sono in conflitto con le dichiarazioni dello spazio dei nomi nell'ambito in cui vengono inseriti è consentito dalla XPathNavigator classe . In questo caso, le dichiarazioni dello spazio dei nomi non vengono dichiarate in ambiti inferiori nel documento XML e non comportano la ridenominazione come illustrato nell'esempio seguente.
<root xmlns:a="http://www.contoso.com">
<parent>
<a:child />
</parent>
</root>
Se l'esempio XML precedente viene modificato nel modo seguente, le dichiarazioni dello spazio dei nomi vengono propagate correttamente nel documento XML al di sotto dell'ambito della dichiarazione di un altro spazio dei nomi.
<root xmlns:a="http://www.contoso.com">
<parent a:parent-id="1234" xmlns:a="http://www.contoso.com/parent-id">
<a:child xmlns:a="http://www.contoso.com/" />
</parent>
</root>
Nell'esempio XML precedente, l'attributo a:parent-id
viene inserito nell'elemento parent
nello spazio dei nomi http://www.contoso.com/parent-id
. Il CreateAttribute metodo viene utilizzato per inserire l'attributo mentre è posizionato sull'elemento parent
. La http://www.contoso.com
dichiarazione dello spazio dei nomi viene inserita automaticamente dalla XPathNavigator classe per mantenere la coerenza del resto del documento XML.
Modifica dei nodi di riferimento delle entità
I nodi di riferimento di entità in un XmlDocument oggetto sono di sola lettura e non possono essere modificati usando le XPathNavigator classi o XmlNode . Qualsiasi tentativo di modificare un nodo di riferimento di entità restituisce un oggetto InvalidOperationException.
Modifica di nodi xsi:nil
La raccomandazione W3C XML Schema introduce il concetto di un elemento annullabile. Quando un elemento è nillable, è possibile che l'elemento non abbia contenuto e che sia ancora valido. Il concetto di un elemento che può essere annullabile è simile al concetto di un oggetto che è null
. La differenza principale è che non è possibile accedere a un null
oggetto in alcun modo, mentre un xsi:nil
elemento dispone ancora di proprietà come gli attributi a cui è possibile accedere, ma non ha contenuto (elementi figlio o testo). L'esistenza dell'attributo xsi:nil
con un valore di true
su un elemento in un documento XML viene utilizzata per indicare che l'elemento non ha contenuto.
Se un XPathNavigator oggetto viene utilizzato per aggiungere contenuto a un elemento valido con un attributo xsi:nil
avente valore true
, il valore del suo attributo xsi:nil
viene impostato su false
.
Annotazioni
Se il contenuto di un elemento con un xsi:nil
attributo impostato su false
viene eliminato, il valore dell'attributo non viene modificato in true
.
Salvataggio di un documento XML
Il salvataggio delle modifiche apportate a un XmlDocument oggetto come risultato dei metodi di modifica descritti in questo argomento viene eseguito utilizzando i metodi della XmlDocument classe . Per altre informazioni sul salvataggio delle modifiche apportate a un XmlDocument oggetto, vedere Salvataggio e scrittura di un documento.