Ta bort XML-data med XPathNavigator
Klassen XPathNavigator innehåller en uppsättning metoder som används för att ta bort noder och värden från ett XML-dokument. För att kunna använda dessa metoder XPathNavigator måste objektet vara redigerbart, dvs. dess CanEdit egenskap måste vara true
.
XPathNavigator objekt som kan redigera ett XML-dokument skapas med CreateNavigator metoden för XmlDocument klassen. XPathNavigator objekt som XPathDocument skapats av klassen är skrivskyddade och alla försök att använda redigeringsmetoderna för ett XPathNavigator objekt som skapas av ett XPathDocument objekt resulterar i en NotSupportedException.
Mer information om hur du skapar redigerbara XPathNavigator objekt finns i Läsa XML-data med XPathDocument och XmlDocument.
Ta bort noder
Klassen XPathNavigator tillhandahåller metoden DeleteSelf för att ta bort noder från ett XML-dokument.
Ta bort en nod
Klassen XPathNavigator tillhandahåller metoden DeleteSelf för att ta bort den aktuella noden som ett XPathNavigator objekt för närvarande är placerat på från ett XML-dokument.
När en nod har tagits bort med hjälp av DeleteSelf metoden kan den inte längre nås från objektets XmlDocument rot. När en nod har tagits bort placeras den XPathNavigator på den överordnade noden i den borttagna noden.
En borttagningsåtgärd påverkar inte positionen för något XPathNavigator objekt som placeras på den borttagna noden. Dessa XPathNavigator objekt är giltiga i den meningen att de kan flyttas inom det borttagna underträdet, men kan inte flyttas till huvudnodträdet med hjälp av XPathNavigator klassens vanliga noduppsättningsnavigeringsmetoder.
Kommentar
Metoden MoveTo för XPathNavigator klassen kan användas för att flytta XPathNavigator dessa objekt tillbaka till huvudnodträdet eller från huvudnodträdet till det borttagna underträdet.
I följande exempel tas elementet price
i det första book
elementet i contosoBooks.xml
filen bort med hjälp av DeleteSelf metoden . Objektets XPathNavigator position när elementet price
har tagits bort finns på det överordnade book
elementet.
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);
Exemplet tar contosoBooks.xml
filen som indata.
<?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>
Ta bort en attributnod
Attributnoder tas bort från ett XML-dokument med hjälp av DeleteSelf metoden .
När en attributnod har tagits bort kan den inte längre nås från rotnoden för ett XmlDocument objekt och XPathNavigator objektet placeras på det överordnade elementet.
Standardattribut
Oavsett vilken metod som används för att ta bort attribut finns det särskilda begränsningar för att ta bort attribut som definieras som standardattribut i DTD- eller XML-schemat för XML-dokumentet. Standardattribut kan inte tas bort om inte elementet de tillhör också tas bort. Standardattribut finns alltid för element som har standardattribut deklarerade, och därför resulterar borttagning av ett standardattribut i att ett ersättningsattribut infogas i elementet och initieras till det standardvärde som deklarerades.
Ta bort värden
Klassen XPathNavigator innehåller SetValue metoderna och SetTypedValue för att ta bort otypade och inskrivna värden från ett XML-dokument.
Ta bort otypade värden
Metoden SetValue infogar helt enkelt det otypade värdet som skickas string
som en parameter som värdet för noden XPathNavigator som objektet för närvarande är placerat på. Om du skickar en tom sträng till SetValue metoden tar du bort värdet för den aktuella noden.
I följande exempel tar du bort värdet för elementet i price
det första book
elementet i contosoBooks.xml
filen med hjälp av SetValue metoden .
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);
Exemplet tar contosoBooks.xml
filen som indata.
<?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>
Ta bort inskrivna värden
När typen av en nod är en enkel W3C XML-schematyp kontrolleras det nya värdet som infogas med SetTypedValue metoden mot fasetter av den enkla typen innan värdet anges. Om det nya värdet inte är giltigt enligt nodens typ (till exempel om du anger ett värde -1
för ett element vars typ är xs:positiveInteger
), resulterar det i ett undantag. Metoden SetTypedValue kan inte heller skickas null
som en parameter. Därför måste borttagningen av värdet för en typad nod överensstämma med nodens schematyp.
I följande exempel tar du bort värdet för elementet price
i det första book
elementet i contosoBooks.xml
filen med hjälp SetTypedValue av metoden genom att ange värdet till 0
. Nodens värde tas inte bort, men priset för boken har tagits bort enligt datatypen 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);
Namnområdesnoder
Det går inte att ta bort namnområdesnoder från ett XmlDocument objekt. Försök att ta bort namnområdesnoder med metoden DeleteSelf resulterar i ett undantag.
Egenskaperna InnerXml och OuterXml
Egenskaperna InnerXmlXPathNavigator och OuterXml för klassen ändrar XML-markering för noderna som ett XPathNavigator objekt för närvarande är placerat på.
Egenskapen InnerXml ändrar XML-markering för de underordnade noder som ett XPathNavigator objekt för närvarande är placerat på med det tolkade innehållet i den angivna XML-koden string
. OuterXml På samma sätt ändrar egenskapen XML-markeringen för de underordnade noder som ett XPathNavigator objekt för närvarande är placerat på samt själva den aktuella noden.
Förutom de metoder som beskrivs i det här avsnittet InnerXml kan egenskaperna och OuterXml användas för att ta bort noder och värden från ett XML-dokument. Mer information om hur du använder InnerXml egenskaperna och OuterXml för att ändra noder finns i avsnittet Ändra XML-data med XPathNavigator .
Spara ett XML-dokument
Att spara ändringar som gjorts i ett XmlDocument objekt som ett resultat av de metoder som beskrivs i det här avsnittet utförs med hjälp av klassens XmlDocument metoder. Mer information om hur du sparar ändringar som gjorts i ett XmlDocument objekt finns i Spara och skriva ett dokument.