XML-gegevens verwijderen met XPathNavigator
De XPathNavigator klasse biedt een set methoden die worden gebruikt om knooppunten en waarden uit een XML-document te verwijderen. Als u deze methoden wilt gebruiken, moet het XPathNavigator object kunnen worden bewerkt, dat wil gezegd: CanEdit de eigenschap ervan moet zijn true
.
XPathNavigator objecten die een XML-document kunnen bewerken, worden gemaakt door de CreateNavigator methode van de XmlDocument klasse. XPathNavigator objecten die door de XPathDocument klasse zijn gemaakt, zijn alleen-lezen en pogingen om de bewerkingsmethoden te gebruiken van een object dat door een XPathNavigatorXPathDocument object is gemaakt, resulteert in een NotSupportedException.
Zie XML-gegevens lezen met XPathDocument en XmlDocument voor meer informatie over het maken van bewerkbare XPathNavigator objecten.
Knooppunten verwijderen
De XPathNavigator klasse biedt de methode voor het DeleteSelf verwijderen van knooppunten uit een XML-document.
Een knooppunt verwijderen
De XPathNavigator klasse biedt de methode voor het DeleteSelf verwijderen van het huidige knooppunt waarop een XPathNavigator object momenteel is geplaatst vanuit een XML-document.
Nadat een knooppunt is verwijderd met behulp van de DeleteSelf methode, is het niet meer bereikbaar vanuit de hoofdmap van het XmlDocument object. Nadat een knooppunt is verwijderd, bevindt het XPathNavigator zich op het bovenliggende knooppunt van het verwijderde knooppunt.
Een verwijderbewerking heeft geen invloed op de positie van een XPathNavigator object dat op het verwijderde knooppunt is geplaatst. Deze XPathNavigator objecten zijn geldig in de zin dat ze in de verwijderde substructuur kunnen worden verplaatst, maar niet naar de hoofdknooppuntstructuur kunnen worden verplaatst met behulp van de normale navigatiemethoden voor knooppuntensets van de XPathNavigator klasse.
Notitie
De MoveTo methode van de XPathNavigator klasse kan worden gebruikt om deze XPathNavigator objecten terug te verplaatsen naar de hoofdknooppuntstructuur of van de hoofdknooppuntstructuur naar de verwijderde substructuur.
In het volgende voorbeeld wordt het price
element van het eerste book
element van het contosoBooks.xml
bestand verwijderd met behulp van de DeleteSelf methode. De positie van het XPathNavigator object nadat het price
element is verwijderd, bevindt zich op het bovenliggende book
element.
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);
In het voorbeeld wordt het contosoBooks.xml
bestand als invoer gebruikt.
<?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>
Een kenmerkknooppunt verwijderen
Kenmerkknooppunten worden verwijderd uit een XML-document met behulp van de DeleteSelf methode.
Nadat een kenmerkknooppunt is verwijderd, is het niet meer bereikbaar vanuit het hoofdknooppunt van een XmlDocument object en wordt het XPathNavigator object op het bovenliggende element geplaatst.
Standaardkenmerken
Ongeacht de methode die wordt gebruikt om kenmerken te verwijderen, zijn er speciale beperkingen voor het verwijderen van kenmerken die zijn gedefinieerd als standaardkenmerken in het DTD- of XML-schema voor het XML-document. Standaardkenmerken kunnen niet worden verwijderd, tenzij het element waartoe ze behoren ook wordt verwijderd. Standaardkenmerken zijn altijd aanwezig voor elementen die standaardkenmerken hebben gedeclareerd. Als u een standaardkenmerk verwijdert, resulteert het verwijderen van een standaardkenmerk in een vervangend kenmerk dat wordt ingevoegd in het element en geïnitialiseerd op de standaardwaarde die is gedeclareerd.
Waarden verwijderen
De XPathNavigator klasse biedt de SetValue en SetTypedValue methoden voor het verwijderen van niet-getypte en getypte waarden uit een XML-document.
Niet-getypte waarden verwijderen
Met SetValue de methode wordt de niet-getypte string
waarde ingevoegd die als parameter wordt doorgegeven als de waarde van het knooppunt waarop het XPathNavigator object momenteel is geplaatst. Als u een lege tekenreeks doorgeeft aan de SetValue methode, wordt de waarde van het huidige knooppunt verwijderd.
In het volgende voorbeeld wordt de waarde van het element van het price
eerste book
element in het contosoBooks.xml
bestand verwijderd met behulp van de SetValue methode.
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);
In het voorbeeld wordt het contosoBooks.xml
bestand als invoer gebruikt.
<?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>
Getypte waarden verwijderen
Wanneer het type van een knooppunt een eenvoudig type W3C XML-schema is, wordt de nieuwe waarde die door de SetTypedValue methode is ingevoegd, gecontroleerd op de facetten van het eenvoudige type voordat de waarde wordt ingesteld. Als de nieuwe waarde niet geldig is op basis van het type van het knooppunt (bijvoorbeeld het instellen van een waarde van -1
een element waarvan het type is xs:positiveInteger
), resulteert deze in een uitzondering. De SetTypedValue methode kan ook niet worden doorgegeven null
als parameter. Als gevolg hiervan moet de waarde van een getypt knooppunt voldoen aan het schematype van het knooppunt.
In het volgende voorbeeld wordt de waarde van het element van het price
eerste book
element in het contosoBooks.xml
bestand verwijderd met behulp van de SetTypedValue methode door de waarde in te stellen op 0
. De waarde van het knooppunt wordt niet verwijderd, maar de prijs van het boek is verwijderd volgens het gegevenstype van xs:decimal
het knooppunt.
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);
Naamruimteknooppunten
Naamruimteknooppunten kunnen niet worden verwijderd uit een XmlDocument object. Pogingen om naamruimteknooppunten te verwijderen met behulp van de DeleteSelf methode resulteert in een uitzondering.
De eigenschappen InnerXml en OuterXml
De InnerXml eigenschappen van OuterXml de XPathNavigator klasse wijzigen de XML-opmaak van de knooppunten waarop een XPathNavigator object momenteel is geplaatst.
De InnerXml eigenschap wijzigt de XML-opmaak van de onderliggende knooppunten waarop een XPathNavigator object momenteel is geplaatst met de geparseerde inhoud van de opgegeven XML string
. Op dezelfde manier wijzigt de OuterXml eigenschap de XML-opmaak van de onderliggende knooppunten waarop een XPathNavigator object momenteel is geplaatst, evenals het huidige knooppunt zelf.
Naast de methoden die in dit onderwerp worden beschreven, kunnen de InnerXml en OuterXml eigenschappen worden gebruikt om knooppunten en waarden uit een XML-document te verwijderen. Zie het onderwerp XML-gegevens wijzigen met XPathNavigator voor meer informatie over het gebruik van de InnerXml en OuterXml eigenschappen voor het wijzigen van knooppunten.
Een XML-document opslaan
Het opslaan van wijzigingen in een XmlDocument object als gevolg van de methoden die in dit onderwerp worden beschreven, wordt uitgevoerd met behulp van de methoden van de XmlDocument klasse. Zie Een document opslaan en schrijven voor meer informatie over het opslaan van wijzigingen in een XmlDocument object.