Sdílet prostřednictvím


Einfügen von XML-Daten mit "XPathNavigator"

Aktualisiert: November 2007

Die XPathNavigator-Klasse stellt eine Gruppe von Methoden bereit, die zum Einfügen von nebengeordneten und untergeordneten Knoten sowie von Attributknoten in ein XML-Dokument verwendet 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".

Einfügen von Knoten

Die XPathNavigator-Klasse stellt Methoden zum Einfügen von nebengeordneten und untergeordneten Knoten sowie von Attributknoten in ein XML-Dokument bereit. Mit diesen Methoden können Sie Knoten und Attribute an verschiedenen Stellen entsprechend der aktuellen Position eines XPathNavigator-Objekts einfügen. Diese Methoden werden in den folgenden Abschnitten beschrieben.

Einfügen von nebengeordneten Knoten

Die XPathNavigator-Klasse stellt die folgenden Methoden zum Einfügen von nebengeordneten Knoten bereit.

Diese Methoden fügen vor und nach dem Knoten, auf dem gerade ein XPathNavigator-Objekt positioniert ist, nebengeordnete Knoten ein.

Die InsertAfter-Methode und die InsertBefore-Methode sind überladen und verwenden als Parameter einen string, ein XmlReader-Objekt oder ein XPathNavigator-Objekt, in dem der hinzuzufügende nebengeordnete Knoten enthalten ist. Beide Methoden geben ein XmlWriter-Objekt zurück, das zum Einfügen von nebengeordneten Knoten verwendet wird.

Die InsertElementAfter-Methode und die InsertElementBefore-Methode fügen vor und nach dem Knoten, auf dem gerade ein XPathNavigator-Objekt positioniert ist, nebengeordnete Knoten ein. Dabei werden das angegebene Namespacepräfix und der angegebene lokale Name, der Namespace-URI und der Wert als Parameter verwendet.

Im folgenden Beispiel wird vor dem untergeordneten price-Element des ersten book-Element in der Datei contosoBooks.xml ein neues pages-Element eingefügt.

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.InsertBefore("<pages>100</pages>")

navigator.MoveToParent()
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.InsertBefore("<pages>100</pages>");

navigator.MoveToParent();
Console.WriteLine(navigator.OuterXml);
XmlDocument^ document = gcnew 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->InsertBefore("<pages>100</pages>");

navigator->MoveToParent();
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>

Weitere Informationen zu den Methoden InsertAfter, InsertBefore, InsertElementAfter und InsertElementBefore finden Sie in der Referenzdokumentation der XPathNavigator-Klasse.

Einfügen von untergeordneten Knoten

Die XPathNavigator-Klasse stellt die folgenden Methoden zum Einfügen von untergeordneten Knoten bereit.

Diese Methoden fügen untergeordnete Knoten an das Ende und an den Anfang der Liste untergeordneter Knoten des Knotens an, auf dem gegenwärtig ein XPathNavigator-Objekt positioniert ist.

Genau wie die Methoden im Abschnitt "Einfügen von nebengeordneten Knoten" verwenden die AppendChild-Methode und die PrependChild-Methode als Parameter einen string, ein XmlReader-Objekt oder ein XPathNavigator-Objekt, in dem der hinzuzufügende nebengeordnete Knoten enthalten ist. Beide Methoden geben ein XmlWriter-Objekt zurück, das zum Einfügen von untergeordneten Knoten verwendet wird.

Genau wie die Methoden im Abschnitt "Einfügen von nebengeordneten Knoten" fügen die AppendChildElement-Methode und die PrependChildElement-Methode einen untergeordneten Knoten an das Ende und an den Anfang der Liste untergeordneter Knoten des Knotens an, auf dem gegenwärtig ein XPathNavigator-Objekt positioniert ist. Dabei werden das angegebene Namespacepräfix und der angegebene lokale Name, der Namespace-URI und der Wert als Parameter verwendet.

Im folgenden Beispiel wird der Liste mit untergeordneten Elementen des ersten book-Elements in der Datei contosoBooks.xml ein neues untergeordnetes pages-Element angefügt.

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.AppendChild("<pages>100</pages>")

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.AppendChild("<pages>100</pages>");

Console.WriteLine(navigator.OuterXml);
XmlDocument^ document = gcnew 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->AppendChild("<pages>100</pages>");

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>

Weitere Informationen zu den Methoden AppendChild, PrependChild, AppendChildElement und PrependChildElement finden Sie in der Referenzdokumentation der XPathNavigator-Klasse.

Einfügen von Attributknoten

Die XPathNavigator-Klasse stellt die folgenden Methoden zum Einfügen von Attributknoten bereit.

Diese Methoden fügen in dem Elementknoten, auf dem gerade ein XPathNavigator-Objekt positioniert ist, Attributknoten ein. Die CreateAttribute-Methode erstellt in dem Elementknoten, auf dem gerade ein XPathNavigator-Objekt positioniert ist, einen Attributknoten. Dabei werden das angegebene Namespacepräfix und der angegebene lokale Name, der Namespace-URI und der Wert als Parameter verwendet. Die CreateAttributes-Methode gibt ein XmlWriter-Objekt zurück, das zum Einfügen von Attributknoten verwendet wird.

Im folgenden Beispiel werden mit dem von der CreateAttributes-Methode zurückgegebenen XmlWriter-Objekt im untergeordneten price-Element des ersten book-Elements in der Datei contosoBooks.xml ein neues discount-Attribut und ein neues currency-Attribut erstellt.

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")

Dim attributes As XmlWriter = navigator.CreateAttributes()

attributes.WriteAttributeString("discount", "1.00")
attributes.WriteAttributeString("currency", "USD")
attributes.Close()

navigator.MoveToParent()
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");

XmlWriter attributes = navigator.CreateAttributes();

attributes.WriteAttributeString("discount", "1.00");
attributes.WriteAttributeString("currency", "USD");
attributes.Close();

navigator.MoveToParent();
Console.WriteLine(navigator.OuterXml);
XmlDocument^ document = gcnew 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");

XmlWriter^ attributes = navigator->CreateAttributes();

attributes->WriteAttributeString("discount", "1.00");
attributes->WriteAttributeString("currency", "USD");
attributes->Close();

navigator->MoveToParent();
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>

Weitere Informationen zur CreateAttribute-Methode und zur CreateAttributes-Methode finden Sie in der Referenzdokumentation der XPathNavigator-Klasse.

Kopieren von Knoten

In bestimmten Fällen möchten Sie möglicherweise ein XML-Dokument mit dem Inhalt eines anderen XML-Dokuments füllen. Sowohl die XPathNavigator-Klasse als auch die XmlWriter-Klasse können Knoten aus einem vorhandenen XmlReader-Objekt oder XPathNavigator-Objekt in ein XmlDocument-Objekt kopieren.

Die Methoden AppendChild, die PrependChild, InsertBefore und InsertAfter der XPathNavigator-Klasse verfügen alle über Überladungen, die ein XPathNavigator-Objekt oder ein XmlReader-Objekt als Parameter annehmen können.

Die WriteNode-Methode der XmlWriter-Klasse verfügt über Überladungen, die ein XmlNode-Objekt, ein XmlReader-Objekt oder ein XPathNavigator-Objekt annehmen können.

Im folgenden Beispiel werden alle book-Elemente aus einem Dokument in ein anderes kopiert.

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

navigator.MoveToChild("bookstore", String.Empty)

Dim newBooks As XPathDocument = New XPathDocument("newBooks.xml")
Dim newBooksNavigator As XPathNavigator = newBooks.CreateNavigator()

Dim nav As XPathNavigator
For Each nav in newBooksNavigator.SelectDescendants("book", "", false)
    navigator.AppendChild(nav)
Next

document.Save("newBooks.xml");
XmlDocument document = new XmlDocument();
document.Load("books.xml");
XPathNavigator navigator = document.CreateNavigator();

navigator.MoveToChild("bookstore", String.Empty);
            
XPathDocument newBooks = new XPathDocument("newBooks.xml");
XPathNavigator newBooksNavigator = newBooks.CreateNavigator();

foreach (XPathNavigator nav in newBooksNavigator.SelectDescendants("book", "", false))
{
    navigator.AppendChild(nav);
}

document.Save("newBooks.xml");

Einfügen von Werten

Die XPathNavigator-Klasse stellt die SetValue-Methode und die SetTypedValue-Methode zum Einfügen von Werten für einen Knoten in ein XmlDocument-Objekt bereit.

Einfügen von nicht typisierten Werten

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. Der Wert wird ohne Typ bzw. (falls Schemainformationen verfügbar sind) ohne Prüfung der Gültigkeit des neuen Werts bezüglich des Knotentyps eingefügt.

Im folgenden Beispiel werden alle price-Elemente in der Datei contosoBooks.xml mit der SetValue-Methode aktualisiert.

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

Dim manager As XmlNamespaceManager = New XmlNamespaceManager(navigator.NameTable)
manager.AddNamespace("bk", "https://www.contoso.com/books")

For Each nav As XPathNavigator In navigator.Select("//bk:price", manager)
    If nav.Value = "11.99" Then
        nav.SetValue("12.99")
    End If
Next

Console.WriteLine(navigator.OuterXml)
XmlDocument document = new XmlDocument();
document.Load("contosoBooks.xml");
XPathNavigator navigator = document.CreateNavigator();

XmlNamespaceManager manager = new XmlNamespaceManager(navigator.NameTable);
manager.AddNamespace("bk", "https://www.contoso.com/books");

foreach (XPathNavigator nav in navigator.Select("//bk:price", manager))
{
    if (nav.Value == "11.99")
    {
        nav.SetValue("12.99");
    }
}

Console.WriteLine(navigator.OuterXml);
XmlDocument^ document = gcnew XmlDocument();
document->Load("contosoBooks.xml");
XPathNavigator^ navigator = document->CreateNavigator();

XmlNamespaceManager^ manager = gcnew XmlNamespaceManager(navigator->NameTable);
manager->AddNamespace("bk", "https://www.contoso.com/books");

for each (XPathNavigator^ nav in navigator->Select("//bk:price", manager))
{
    if(nav->Value == "11.99")
    {
        nav->SetValue("12.99");
    }
}

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>

Einfügen von typisierten Werten

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.

Im folgenden Beispiel wird versucht, den Wert des price-Elements des ersten book-Elements der Datei contosoBooks.xml in einen DateTime-Wert zu ändern. Da der XML-Schematyp des price-Elements in den contosoBooks.xsd-Dateien als xs:decimal definiert ist, führt dies zu einer Ausnahme.

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(DateTime.Now)
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(DateTime.Now);

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>

In diesem Beispiel wird auch contosoBooks.xsd als Eingabe verwendet.

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="https://www.contoso.com/books" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="bookstore">
        <xs:complexType>
            <xs:sequence>
                <xs:element maxOccurs="unbounded" name="book">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="title" type="xs:string" />
                            <xs:element name="author">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element minOccurs="0" name="name" type="xs:string" />
                                        <xs:element minOccurs="0" name="first-name" type="xs:string" />
                                        <xs:element minOccurs="0" name="last-name" type="xs:string" />
                                    </xs:sequence>
                                </xs:complexType>
                            </xs:element>
                            <xs:element name="price" type="xs:decimal" />
                        </xs:sequence>
                        <xs:attribute name="genre" type="xs:string" use="required" />
                        <xs:attribute name="publicationdate" type="xs:date" use="required" />
                        <xs:attribute name="ISBN" type="xs:string" use="required" />
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

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 Einfügen von Knoten und Werten in ein XML-Dokument verwendet werden. Weitere Informationen zum Verwenden der InnerXml-Eigenschaft und der OuterXml-Eigenschaft zum Einfügen von Knoten und Werten finden Sie im Thema Ändern von XML-Daten mit "XPathNavigator".

Konflikte bei Namespaces und "xml:lang"

Beim Einfügen von XML-Daten mit der Methoden InsertBefore, InsertAfter, AppendChild und PrependChild der XPathNavigator-Klasse, die XmlReader-Objekte als Parameter verwenden, können bestimmte Konflikte bezüglich des Gültigkeitsbereichs von Namespaces und xml:lang-Deklarationen auftreten.

Nachfolgend werden alle möglicherweise auftretenden Konflikte bei Namespaces dargestellt.

  • Wenn sich ein Namespace innerhalb des Kontextbereichs des XmlReader-Objekts befindet, bei dem sich das Präfix zur Zuordnung des Namespace-URI nicht im Kontext des XPathNavigator-Objekts befindet, wird dem neu eingefügten Knoten eine neue Namespacedeklaration hinzugefügt.

  • Wenn sich der gleiche Namespace-URI innerhalb des Kontextbereichs des XmlReader-Objekts und des XPathNavigator-Objekts befindet, aber wenn ihm in beiden Kontexten ein anderes Präfix zugeordnet wurde, wird dem neu eingefügten Knoten eine neue Namespacedeklaration hinzugefügt, wobei das Präfix und der Namespace-URI des XmlReader-Objekts verwendet werden.

  • Wenn sich das gleiche Namespacepräfix innerhalb des Kontextbereichs des XmlReader-Objekts und des XPathNavigator-Objekts befindet, aber wenn ihm in beiden Kontexten ein anderer Namespace-URI zugeordnet wurde, wird dem neu eingefügten Knoten eine neue Namespacedeklaration hinzugefügt,. Dabei wird das Präfix mit dem Namespace-URI des XmlReader-Objekts erneut deklariert.

  • Wenn das Präfix sowie der Namespace-URI im Kontext des XmlReader-Objekts und im Kontext des XPathNavigator-Objekts gleich sind, wird dem neu eingefügten Knoten keine neue Namespacedeklaration hinzugefügt.

Hinweis:

Die oben genannte Beschreibung gilt auch für Namespacedeklarationen mit einem leeren string als Präfix (z. B. die Standardnamespacedeklaration).

Nachfolgend werden alle möglicherweise auftretenden Konflikte bei xml:lang dargestellt.

  • Wenn sich ein xml:lang-Attribut im Kontextbereich des XmlReader-Objekts, aber nicht im Kontext des XPathNavigator-Objekts befindet, wird dem neu eingefügten Knoten ein xml:lang-Attribut hinzugefügt, dessen Wert aus dem XmlReader-Objekt entnommen wird.

  • Wenn sich ein xml:lang-Attribut im Kontextbereich des XmlReader-Objekts und des XPathNavigator-Objekts befindet, aber jedes Attribut einen anderen Wert besitzt, wird dem neu eingefügten Knoten ein xml:lang-Attribut hinzugefügt, dessen Wert aus dem XmlReader-Objekt entnommen wird.

  • Wenn sich ein xml:lang-Attribut im Kontextbereich des XmlReader-Objekts und des XPathNavigator-Objekts befindet, aber beide Attribute den gleichen Wert besitzen, wird dem neu eingefügten Knoten kein neues xml:lang-Attribut hinzugefügt.

  • Wenn sich ein xml:lang-Attribut im Kontextbereich des XPathNavigator-Objekts, aber nicht im Kontextbereich des XmlReader-Objekts befindet, wird dem neu eingefügten Knoten kein xml:lang-Attribut hinzugefügt.

Einfügen von Knoten mit "XmlWriter"

Die im Abschnitt zum Einfügen von Knoten und Werten beschriebenen Methoden zum Einfügen von nebengeordneten und untergeordneten Knoten sowie von Attributknoten sind überladen. Die Methoden InsertAfter, InsertBefore, AppendChild, PrependChild und CreateAttributes der XPathNavigator-Klasse geben ein XmlWriter-Objekt zurück, das zum Einfügen von Knoten verwendet wird.

Nicht unterstützte XmlWriter-Methoden

Nicht alle Methoden, mit denen unter Verwendung der XmlWriter-Klasse Informationen in ein XML-Dokument geschrieben werden, werden aufgrund des Unterschieds zwischen dem XPath-Datenmodell und dem DOM (Dokumentobjektmodell) von der XPathNavigator-Klasse unterstützt.

In der folgenden Tabelle werden die Methoden der XmlWriter-Klasse beschrieben, die nicht von der XPathNavigator-Klasse unterstützt werden.

Methode

Beschreibung

WriteEntityRef

Löst eine NotSupportedException-Ausnahme aus.

WriteDocType

Wird auf der Stammebene ignoriert und löst beim Aufrufen auf einer anderen Ebene im XML-Dokument eine NotSupportedException-Ausnahme aus.

WriteCData

Wird wie ein Aufruf der WriteString-Methode für die entsprechenden Zeichen behandelt.

WriteCharEntity

Wird wie ein Aufruf der WriteString-Methode für die entsprechenden Zeichen behandelt.

WriteSurrogateCharEntity

Wird wie ein Aufruf der WriteString-Methode für die entsprechenden Zeichen behandelt.

Weitere Informationen zur XmlWriter-Klasse finden Sie in der Referenzdokumentation der XmlWriter-Klasse.

Mehrere XmlWriter-Objekte

Es ist möglich, über mehrere XPathNavigator-Objekte zu verfügen, die auf verschiedene Teile eines XML-Dokuments mit einem oder mehreren offenen XmlWriter-Objekten zeigen. In Szenarios mit einfachen Threads sind mehrere XmlWriter-Objekte zulässig und werden dort unterstützt.

Die folgenden beiden Anmerkungen sollten bei der Verwendung mehrerer XmlWriter-Objekte unbedingt beachtet werden.

  • Dem XML-Dokument werden von XmlWriter-Objekten geschriebene XML-Fragmente hinzugefügt, wenn die Close-Methode eines jeden XmlWriter-Objekts aufgerufen wird. Bis zu diesem Zeitpunkt schreibt das XmlWriter-Objekt ein nicht verbundenes Fragment. Das Ausführen eines Vorgangs für das XML-Dokument wirkt sich nicht auf Fragmente aus, die vor dem Aufrufen von Close von einem XmlWriter-Objekt geschrieben wurden.

  • Wenn sich auf einer bestimmten XML-Teilstruktur ein offenes XmlWriter-Objekt befindet und diese Teilstruktur gelöscht wird, könnte das XmlWriter-Objekt der Teilstrukur noch hinzugefügt werden. Aus der Teilstruktur wird einfach ein gelöschtes Fragment.

  • Wenn an der gleichen Stelle im XML-Dokument mehrere XmlWriter-Objekte geöffnet sind, werden sie dem XML-Dokument in der Reihenfolge hinzugefügt, in der die XmlWriter-Objekte geschlossen werden, und nicht in der Reihenfolge, in der sie geöffnet wurden.

Im folgenden Beispiel werden ein XmlDocument-Objekt sowie ein XPathNavigator-Objekt erstellt und anschließend ein von der PrependChild-Methode zurückgegebenes XmlWriter-Objekt verwendet, um die Struktur des ersten Buchs in der Datei books.xml zu erstellen. Anschließend wird sie im Beispiel als die Datei book.xml gespeichert.

Dim document As XmlDocument = New XmlDocument()
Dim navigator As XPathNavigator = document.CreateNavigator()

Using writer As XmlWriter = navigator.PrependChild()

    writer.WriteStartElement("bookstore")
    writer.WriteStartElement("book")
    writer.WriteAttributeString("genre", "autobiography")
    writer.WriteAttributeString("publicationdate", "1981-03-22")
    writer.WriteAttributeString("ISBN", "1-861003-11-0")
    writer.WriteElementString("title", "The Autobiography of Benjamin Franklin")
    writer.WriteStartElement("author")
    writer.WriteElementString("first-name", "Benjamin")
    writer.WriteElementString("last-name", "Franklin")
    writer.WriteElementString("price", "8.99")
    writer.WriteEndElement()
    writer.WriteEndElement()
    writer.WriteEndElement()

End Using

document.Save("book.xml")
XmlDocument document = new XmlDocument();
XPathNavigator navigator = document.CreateNavigator();

using (XmlWriter writer = navigator.PrependChild())
{
    writer.WriteStartElement("bookstore");
    writer.WriteStartElement("book");
    writer.WriteAttributeString("genre", "autobiography");
    writer.WriteAttributeString("publicationdate", "1981-03-22");
    writer.WriteAttributeString("ISBN", "1-861003-11-0");
    writer.WriteElementString("title", "The Autobiography of Benjamin Franklin");
    writer.WriteStartElement("author");
    writer.WriteElementString("first-name", "Benjamin");
    writer.WriteElementString("last-name", "Franklin");
    writer.WriteElementString("price", "8.99");
    writer.WriteEndElement();
    writer.WriteEndElement();
    writer.WriteEndElement();
}
document.Save("book.xml");

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

Ändern von XML-Daten mit "XPathNavigator"

Entfernen von XML-Daten mit "XPathNavigator"

Referenz

XmlDocument

XPathDocument

XPathNavigator