Usuwanie danych XML przy użyciu klasy XPathNavigator
Klasa XPathNavigator udostępnia zestaw metod używanych do usuwania węzłów i wartości z dokumentu XML. Aby można było używać tych metod, XPathNavigator obiekt musi być edytowalny, czyli jego CanEdit właściwość musi mieć wartość true
.
XPathNavigator obiekty, które mogą edytować dokument XML, są tworzone przez CreateNavigator metodę XmlDocument klasy . XPathNavigator obiekty utworzone przez klasę XPathDocument są tylko do odczytu, a każda próba użycia metod edycji obiektu utworzonego XPathNavigator przez XPathDocument obiekt powoduje wyświetlenie NotSupportedExceptionobiektu .
Aby uzyskać więcej informacji na temat tworzenia obiektów edytowalnych XPathNavigator , zobacz Odczytywanie danych XML przy użyciu elementów XPathDocument i XmlDocument.
Usuwanie węzłów
Klasa XPathNavigator udostępnia metodę DeleteSelf usuwania węzłów z dokumentu XML.
Usuwanie węzła
Klasa XPathNavigator udostępnia metodę DeleteSelf usuwania bieżącego węzła XPathNavigator , na który jest obecnie umieszczony obiekt z dokumentu XML.
Po usunięciu DeleteSelf węzła przy użyciu metody nie jest już osiągalny z katalogu głównego XmlDocument obiektu. Po usunięciu XPathNavigator węzła element jest umieszczony w węźle nadrzędnym usuniętego węzła.
Operacja usuwania nie ma wpływu na położenie żadnego XPathNavigator obiektu umieszczonego w usuniętym węźle. Te XPathNavigator obiekty są prawidłowe w tym sensie, że mogą poruszać się w usuniętym poddrzewie, ale nie można ich przenieść do głównego drzewa węzłów przy użyciu zwykłych metod nawigacji zestawu węzłów XPathNavigator klasy.
Uwaga
Metoda MoveToXPathNavigator klasy może służyć do przenoszenia tych XPathNavigator obiektów z powrotem do głównego drzewa węzłów lub z drzewa głównego węzła do usuniętego poddrzewa.
W poniższym przykładzie price
element pierwszego book
elementu contosoBooks.xml
pliku zostanie usunięty przy użyciu DeleteSelf metody . Położenie XPathNavigator obiektu po usunięciu price
elementu znajduje się w elemecie nadrzędnym 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);
W przykładzie plik jest contosoBooks.xml
pobierany jako dane wejściowe.
<?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>
Usuwanie węzła atrybutu
Węzły atrybutów są usuwane z dokumentu XML przy użyciu DeleteSelf metody .
Po usunięciu węzła atrybutu nie jest już osiągalny z węzła XmlDocument głównego obiektu, a XPathNavigator obiekt jest umieszczony na elemecie nadrzędnym.
Atrybuty domyślne
Niezależnie od metody używanej do usuwania atrybutów istnieją specjalne ograniczenia dotyczące usuwania atrybutów zdefiniowanych jako atrybuty domyślne w schemacie DTD lub XML dla dokumentu XML. Nie można usunąć atrybutów domyślnych, chyba że element, do którego należy, również zostanie usunięty. Atrybuty domyślne są zawsze obecne dla elementów, które mają zadeklarowane atrybuty domyślne, a w rezultacie usunięcie atrybutu domyślnego powoduje wstawienie atrybutu zastępczego do elementu i zainicjowanie do wartości domyślnej, która została zadeklarowana.
Usuwanie wartości
Klasa XPathNavigator udostępnia SetValue metody i SetTypedValue do usuwania nietypowych i wpisanych wartości z dokumentu XML.
Usuwanie nietypowych wartości
Metoda SetValue po prostu wstawia nietypową string
wartość przekazaną jako parametr jako wartość węzła XPathNavigator , na który jest obecnie umieszczony obiekt. Przekazanie pustego ciągu do SetValue metody spowoduje usunięcie wartości bieżącego węzła.
Poniższy przykład usuwa wartość price
elementu pierwszego book
elementu w contosoBooks.xml
pliku przy użyciu SetValue metody .
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);
W przykładzie plik jest contosoBooks.xml
pobierany jako dane wejściowe.
<?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>
Usuwanie wpisanych wartości
Gdy typ węzła jest prostym typem schematu XML W3C, nowa wartość wstawiona przez SetTypedValue metodę jest sprawdzana względem aspektów prostego typu przed ustawieniem wartości. Jeśli nowa wartość jest nieprawidłowa zgodnie z typem węzła (na przykład ustawienie wartości -1
elementu, którego typem jest xs:positiveInteger
), powoduje wyjątek. Nie SetTypedValue można również przekazać null
metody jako parametru. W rezultacie usunięcie wartości typizowanego węzła musi być zgodne z typem schematu węzła.
Poniższy przykład usuwa wartość price
elementu pierwszego book
elementu w contosoBooks.xml
pliku przy użyciu metody , SetTypedValue ustawiając wartość na 0
. Wartość węzła nie jest usuwana, ale cena książki została usunięta zgodnie z typem danych .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);
Węzły przestrzeni nazw
Nie można usunąć węzłów przestrzeni nazw z XmlDocument obiektu. Próby usunięcia węzłów przestrzeni nazw przy użyciu DeleteSelf metody powoduje wyjątek.
Właściwości InnerXml i OuterXml
Właściwości InnerXmlXPathNavigator i OuterXml klasy zmieniają znaczniki XML węzłówXPathNavigator, na których obecnie znajduje się obiekt.
Właściwość InnerXml zmienia znacznik XML węzłów XPathNavigator podrzędnych, na których jest obecnie umieszczony obiekt z analizowaną zawartością danego pliku XML string
. OuterXml Podobnie właściwość zmienia znacznik XML węzłów XPathNavigator podrzędnych, na których obecnie znajduje się obiekt, a także bieżący węzeł.
Oprócz metod opisanych w tym temacie InnerXml właściwości i OuterXml mogą służyć do usuwania węzłów i wartości z dokumentu XML. Aby uzyskać więcej informacji na temat używania InnerXml właściwości i OuterXml do modyfikowania węzłów, zobacz temat Modyfikowanie danych XML przy użyciu klasy XPathNavigator .
Zapisywanie dokumentu XML
Zapisywanie zmian wprowadzonych w XmlDocument obiekcie w wyniku metod opisanych w tym temacie odbywa się przy użyciu metod XmlDocument klasy. Aby uzyskać więcej informacji na temat zapisywania zmian wprowadzonych w XmlDocument obiekcie, zobacz Zapisywanie i zapisywanie dokumentu.