Sdílet prostřednictvím


Entfernen von XML-Daten mit "XPathNavigator"

Aktualisiert: November 2007

Die XPathNavigator-Klasse stellt eine Gruppe von Methoden bereit, mit denen Knoten und Werte aus einem XML-Dokument entfernt werden. Diese Methoden können nur dann verwendet werden, wenn das XPathNavigator-Objekt bearbeitet werden kann, d. h. seine CanEdit-Eigenschaft muss true sein.

XPathNavigator-Objekte, die ein XML-Dokument bearbeiten können, werden mit der CreateNavigator-Methode der XmlDocument-Klasse erstellt. Von der XPathDocument-Klasse erstellte XPathNavigator-Objekte sind schreibgeschützt, und ein Versuch, die Bearbeitungsmethoden eines von einem XPathDocument-Objekt erstellten XPathNavigator-Objekts zu verwenden, führt zu einer NotSupportedException.

Weitere Informationen zum Erstellen von editierbaren XPathNavigator-Objekten finden Sie unter Lesen von XML-Daten mithilfe von "XPathDocument" und "XmlDocument".

Entfernen von Knoten

Die XPathNavigator-Klasse stellt die DeleteSelf-Methode zum Entfernen von Knoten aus einem XML-Dokument bereit.

Entfernen eines Knotens

Die XPathNavigator-Klasse stellt die DeleteSelf-Methode bereit, mit der der aktuelle Knoten aus einem XML-Dokument gelöscht werden kann, auf dem sich gerade ein XPathNavigator-Objekt befindet.

Nachdem ein Knoten mithilfe der DeleteSelf-Methode gelöscht wurde, kann vom Stamm eines XmlDocument-Objekts aus nicht mehr darauf zugegriffen werden. Nachdem der Knoten gelöscht wurde, wird der XPathNavigator auf dem übergeordneten Knoten des gelöschten Knotens positioniert.

Der Löschvorgang hat keine Auswirkungen auf die Position der XPathNavigator-Objekte, die sich auf dem gelöschten Knoten befinden. Diese XPathNavigator-Objekte sind insofern gültig, als sie innerhalb der gelöschten Teilstruktur verschoben werden können. Sie können jedoch nicht mit einer der regulären Knotensatz-Navigationsmethoden der XPathNavigator-Klasse in die Hauptknotenstruktur verschoben werden.

Hinweis:

Mithilfe der MoveTo-Methode der XPathNavigator-Klasse können diese XPathNavigator-Objekte zurück in die entsprechende Hauptknotenstruktur verschoben werden bzw. aus dieser in die gelöschte Teilstruktur verschoben werden.

Im folgenden Beispiel wird das price-Element des ersten book-Elements der Datei contosoBooks.xml mithilfe der DeleteSelf-Methode gelöscht. Die Position des XPathNavigator-Objekts, nachdem das price-Element im übergeordneten book-Element gelöscht wurde.

Dim document As XmlDocument = New XmlDocument()
document.Load("contosoBooks.xml")
Dim navigator As XPathNavigator = document.CreateNavigator()

navigator.MoveToChild("bookstore", "https://www.contoso.com/books")
navigator.MoveToChild("book", "https://www.contoso.com/books")
navigator.MoveToChild("price", "https://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", "https://www.contoso.com/books");
navigator.MoveToChild("book", "https://www.contoso.com/books");
navigator.MoveToChild("price", "https://www.contoso.com/books");

navigator.DeleteSelf();

Console.WriteLine("Position after delete: {0}", navigator.Name);
Console.WriteLine(navigator.OuterXml);

In diesem Beispiel wird die Datei contosoBooks.xml als Eingabe verwendet.

<bookstore xmlns="https://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>

Entfernen eines Attributknotens

Attributknoten können mithilfe der DeleteSelf-Methode aus einem XML-Dokument entfernt werden.

Nachdem ein Attributknoten gelöscht wurde, kann nicht mehr von einem Stammknoten eines XmlDocument-Objekts aus darauf zugegriffen werden, und das XPathNavigator-Objekt wird auf dem übergeordneten Element positioniert.

Standardattribute

Unabhängig davon, mit welcher Methode Attribute entfernt wurden, bestehen spezielle Einschränkungen für das Entfernen von Standardattributen in der DTD oder im XML-Schema des XML-Dokuments. Standardattribute können nicht entfernt werden, wenn nicht das zugehörige Element ebenfalls entfernt wird. Standardattribute sind immer für Elemente vorhanden, für die Standardattribute deklariert wurden. Daher führt das Löschen eines Standardattributs dazu, dass ein Ersatzattribut in das Element eingefügt und der deklarierte Standardwert initialisiert wird.

Entfernen von Werten

Die XPathNavigator-Klasse stellt die SetValue-Methode und die SetTypedValue-Methode zum Entfernen von nicht typisierten und typisierten Knoten aus einem XML-Dokument bereit.

Entfernen nicht typisierter Werte

Die SetValue-Methode fügt einfach den als Parameter übergebenen nicht typisierten string-Wert als Wert des Knotens ein, auf dem das XPathNavigator-Objekt gerade positioniert ist. Durch Übergeben einer leeren Zeichenfolge an die SetValue-Methode wird der Wert des aktuellen Knotens entfernt.

Im folgenden Beispiel wird der Wert des price-Elements des ersten book-Elements der Datei contosoBooks.xml mithilfe der SetValue-Methode entfernt.

Dim document As XmlDocument = New XmlDocument()
document.Load("contosoBooks.xml")
Dim navigator As XPathNavigator = document.CreateNavigator()

navigator.MoveToChild("bookstore", "https://www.contoso.com/books")
navigator.MoveToChild("book", "https://www.contoso.com/books")
navigator.MoveToChild("price", "https://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", "https://www.contoso.com/books");
navigator.MoveToChild("book", "https://www.contoso.com/books");
navigator.MoveToChild("price", "https://www.contoso.com/books");

navigator.SetValue("");

navigator.MoveToRoot();
Console.WriteLine(navigator.OuterXml);

In diesem Beispiel wird die Datei contosoBooks.xml als Eingabe verwendet.

<bookstore xmlns="https://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>

Entfernen typisierter Werte

Wenn der Typ ein einfacher W3C-XML-Schematyp ist, wird der neue mit der SetTypedValue-Methode eingefügte Wert anhand aller Facets des einfachen Typs überprüft, bevor er festgelegt wird. Wenn der neue Wert bezüglich des Knotentyps nicht gültig ist (z. B. der Wert -1 für ein Element vom Typ xs:positiveInteger), wird eine Ausnahme ausgelöst. Außerdem ist es nicht möglich, der SetTypedValue-Methode null als Parameter zu übergeben. Daher muss das Entfernen eines typisierten Werts in Übereinstimmung mit dem Schematyp des Knotens erfolgen.

Im folgenden Beispiel wird der Wert des price-Elements des ersten book-Elements der Datei contosoBooks.xml mithilfe der SetTypedValue-Methode entfernt, indem der Wert auf 0 festgelegt wird. Der Wert des Knotens wird nicht entfernt, es wird jedoch der Buchpreis entsprechend seinem Datentyp xs:decimal entfernt.

Dim settings As XmlReaderSettings = New XmlReaderSettings()
settings.Schemas.Add("https://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", "https://www.contoso.com/books")
navigator.MoveToChild("book", "https://www.contoso.com/books")
navigator.MoveToChild("price", "https://www.contoso.com/books")

navigator.SetTypedValue(0)

navigator.MoveToRoot()
Console.WriteLine(navigator.OuterXml)
XmlReaderSettings settings = new XmlReaderSettings();
settings.Schemas.Add("https://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", "https://www.contoso.com/books");
navigator.MoveToChild("book", "https://www.contoso.com/books");
navigator.MoveToChild("price", "https://www.contoso.com/books");

navigator.SetTypedValue(0);

navigator.MoveToRoot();
Console.WriteLine(navigator.OuterXml);

Namespaceknoten

Namespaceknoten können nicht aus einem XmlDocument-Objekt gelöscht werden. Beim Versuch, Namespaceknoten mithilfe der DeleteSelf-Methode zu löschen, wird eine Ausnahme ausgelöst.

Die Eigenschaften "InnerXml" und "OuterXml"

Die InnerXml-Eigenschaft und die OuterXml-Eigenschaft der XPathNavigator-Klasse ändern das XML-Markup der Knoten, auf denen derzeit ein XPathNavigator-Objekt positioniert ist.

Die InnerXml-Eigenschaft ändert das XML-Markup der untergeordneten Knoten, auf denen derzeit ein XPathNavigator-Objekt positioniert ist, mit den analysierten Inhalten des angegebenen XML-string. Ebenso ändert die OuterXml-Eigenschaft das XML-Markup der untergeordneten Knoten, auf denen derzeit ein XPathNavigator-Objekt positioniert ist, sowie den aktuellen Knoten selbst.

Neben den in diesem Thema beschriebenen Methoden können die InnerXml-Eigenschaft und die OuterXml-Eigenschaft zum Entfernen von Knoten und Werten aus einem XML-Dokument verwendet werden. Weitere Informationen zum Verwenden der InnerXml-Eigenschaft und der OuterXml-Eigenschaft zum Ändern von Knoten finden Sie im Thema Ändern von XML-Daten mit "XPathNavigator".

Speichern eines XML-Dokuments

Änderungen eines XmlDocument-Objekts, die von den in diesem Thema beschriebenen Methoden vorgenommen wurden, werden mit den Methoden der XmlDocument-Klasse gespeichert. Weitere Informationen zum Speichern der an einem XmlDocument-Objekt vorgenommenen Änderungen finden Sie unter Speichern und Ausgeben eines Dokuments.

Siehe auch

Konzepte

Verarbeiten von XML-Daten mithilfe des XPath-Datenmodells

Einfügen von XML-Daten mit "XPathNavigator"

Ändern von XML-Daten mit "XPathNavigator"

Referenz

XmlDocument

XPathDocument

XPathNavigator