Condividi tramite


Rimozione di dati XML con XPathNavigator

La classe XPathNavigator fornisce un set di metodi usati per rimuovere nodi e valori da 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.

Rimozione di nodi

La classe XPathNavigator fornisce il metodo DeleteSelf per rimuovere nodi da un documento XML.

Rimozione di un nodo

La classe XPathNavigator fornisce il metodo DeleteSelf per eliminare da un documento XML il nodo corrente su cui è attualmente posizionato un oggetto XPathNavigator.

Dopo che un nodo è stato eliminato usando il metodo DeleteSelf, non è più possibile raggiungerlo dal livello radice dell'oggetto XmlDocument. Dopo che un nodo è stato eliminato, la classe XPathNavigator viene posizionata sul nodo padre del nodo eliminato.

Un'operazione di eliminazione non influenza la posizione di un oggetto XPathNavigator collocato sul nodo eliminato. Questi oggetti XPathNavigator sono validi nel senso che è possibile spostarli all'interno del sottoalbero eliminato ma non è possibile spostarli nell'albero principale dei nodi usando i normali metodi di navigazione dei set di nodi della classe XPathNavigator.

Nota

È possibile usare il metodo MoveTo della classe XPathNavigator per riportare questi oggetti XPathNavigator nell'albero principale dei nodi o per spostarli dall'albero principale al sottoalbero eliminato.

Nell'esempio seguente l'elemento price del primo elemento book del file contosoBooks.xml viene eliminato usando il metodo DeleteSelf. Dopo che l'elemento XPathNavigator è stato eliminato, l'oggetto price è posizionato sull'elemento padre book.

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.DeleteSelf()  
  
Console.WriteLine("Position after delete: {0}", navigator.Name)  
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.DeleteSelf();  
  
Console.WriteLine("Position after delete: {0}", navigator.Name);  
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>

Rimozione di un nodo Attribute

I nodi Attribute vengono rimossi da un documento XML usando il metodo DeleteSelf.

Dopo che un nodo Attribute è stato eliminato, non è più possibile raggiungerlo dal nodo radice di un oggetto XmlDocument e l'oggetto XPathNavigator viene posizionato sull'elemento padre.

Attributi predefiniti

Indipendentemente dal metodo usato per rimuovere gli attributi, la rimozione di attributi definiti come attributi predefiniti nella DTD o in XML Schema per il documento XML è soggetta ad alcuni limiti specifici. Non è possibile rimuovere gli attributi predefiniti, a meno che non venga rimosso anche l'elemento al quale appartengono. Gli attributi predefiniti sono sempre presenti per gli elementi con attributi predefiniti dichiarati. Di conseguenza, l'eliminazione di un attributo predefinito determina l'inserimento di un attributo di sostituzione nell'elemento e la relativa inizializzazione in base al valore predefinito che era stato dichiarato.

Rimozione di valore

La classe XPathNavigator fornisce i metodi SetValue e SetTypedValue per rimuovere valori tipizzati e non tipizzati da un documento XML.

Rimozione 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 passaggio di una stringa vuota al metodo SetValue causa la rimozione del valore del nodo corrente.

Nell'esempio seguente il valore dell'elemento price del primo elemento book del file contosoBooks.xml viene rimosso usando il metodo SetValue.

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.SetValue("")  
  
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.SetValue("");  
  
navigator.MoveToRoot();  
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>

Rimozione 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. Anche al metodo SetTypedValue non può essere passato il valore null come parametro. Di conseguenza la rimozione del valore di un nodo tipizzato deve essere conforme al tipo di schema del nodo.

Nell'esempio seguente il valore dell'elemento price del primo elemento book del file contosoBooks.xml viene rimosso usando il metodo SetTypedValue, impostando il valore su 0. Il valore del nodo non viene rimosso, ma il prezzo del libro è stato rimosso in base al relativo tipo di dati xs:decimal.

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(0)  
  
navigator.MoveToRoot()  
Console.WriteLine(navigator.OuterXml)  
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(0);  
  
navigator.MoveToRoot();  
Console.WriteLine(navigator.OuterXml);  

Nodi dello spazio dei nomi

Non è possibile eliminare i nodi dello spazio dei nomi da un oggetto XmlDocument. I tentativi di eliminare i nodi dello spazio dei nomi usando il metodo DeleteSelf generano un'eccezione.

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'utilizzo delle proprietà InnerXml e OuterXml per modificare i nodi, vedere l'argomento Modificare i dati XML con XPathNavigator.

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