Udostępnij za pomocą


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 XPathNavigator, który został utworzony przez XPathDocument obiekt, powoduje wyświetlenie NotSupportedException.

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 do usunięcia bieżącego węzła z dokumentu XML, na którym obecnie znajduje się obiekt XPathNavigator.

Po tym, jak węzeł został usunięty przy użyciu metody DeleteSelf, nie jest już osiągalny z korzenia obiektu XmlDocument. Po usunięciu węzła XPathNavigator jest umieszczony na 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 / Notatka

Metoda MoveTo klasy XPathNavigator może być użyta do przemieszczania tych XPathNavigator obiektów ponownie do głównego drzewa węzłów, lub z głównego drzewa węzłów 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 wykorzystuje się plik contosoBooks.xml 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 metody SetValue i SetTypedValue do usuwania nieopisanych i typowanych 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 metody SetValue spowoduje usunięcie wartości bieżącego węzła.

Poniższy przykład usuwa wartość elementu price pierwszego elementu book w pliku contosoBooks.xml przy użyciu metody 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);  

W przykładzie wykorzystuje się plik contosoBooks.xml 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. Metody SetTypedValue nie można również przekazać jako parametr null. 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 metody DeleteSelf powodują wyjątek.

Właściwości InnerXml i OuterXml

Właściwości InnerXml i OuterXml klasy XPathNavigator zmieniają znacznik XML węzłów, na których obiekt XPathNavigator obecnie się znajduje.

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. Właściwość OuterXml zmienia znacznik XML zarówno dla węzłów podrzędnych, na których jest aktualnie umieszczony obiekt XPathNavigator, jak i dla samego bieżącego węzła.

Oprócz metod opisanych w tym temacie, właściwości InnerXml 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 właściwości InnerXml i OuterXml do modyfikowania węzłów, zobacz temat Modyfikowanie danych XML przy użyciu 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.

Zobacz także