Udostępnij za pośrednictwem


Wstawianie danych XML przy użyciu klasy XPathNavigator

Klasa XPathNavigator udostępnia zestaw metod używanych do wstawiania węzłów równorzędnych, podrzędnych i atrybutów w dokumencie 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.

Wstawianie węzłów

Klasa XPathNavigator udostępnia metody wstawiania węzłów równorzędnych, podrzędnych i atrybutów w dokumencie XML. Te metody umożliwiają wstawianie węzłów i atrybutów w różnych lokalizacjach w odniesieniu do bieżącej XPathNavigator pozycji obiektu i opisano je w poniższych sekcjach.

Wstawianie węzłów równorzędnych

Klasa XPathNavigator udostępnia następujące metody wstawiania węzłów równorzędnych.

Te metody wstawiają węzły równorzędne przed i po węźle XPathNavigator, na którym obecnie jest pozycjonowany obiekt.

Metody InsertAfter i InsertBefore są przeciążone i akceptują stringobiekt , XmlReader lub XPathNavigator obiekt zawierający węzeł równorzędny, aby dodać jako parametry. Obie metody zwracają obiekt XmlWriter, który jest używany do wstawiania węzłów równorzędnych.

Metody InsertElementAfter i InsertElementBefore wstawiają jeden węzeł równorzędny przed węzłem oraz po węźle, na którym obecnie znajduje się obiekt XPathNavigator, wykorzystując przedrostek przestrzeni nazwowy, nazwę lokalną, identyfikator URI przestrzeni nazw i wartość określone jako parametry.

W poniższym przykładzie nowy pages element jest wstawiany przed price elementem podrzędnym pierwszego book elementu w contosoBooks.xml pliku.

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

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

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

Aby uzyskać więcej informacji na temat metod InsertAfter, InsertBefore, InsertElementAfter i InsertElementBefore, zobacz dokumentację referencyjną klasy XPathNavigator.

Wstawianie węzłów podrzędnych

Klasa XPathNavigator udostępnia następujące metody wstawiania węzłów podrzędnych.

Te metody dodają węzły podrzędne na końcu i na początku listy węzłów podrzędnych, na których obecnie znajduje się obiekt XPathNavigator.

Podobnie jak metody w sekcji "Wstawianie węzłów równorzędnych", metody AppendChild i PrependChild akceptują string obiekt, XmlReader lub obiekt XPathNavigator zawierający węzeł podrzędny jako parametr do dodania. Obie metody zwracają obiekt XmlWriter, który jest używany do wstawiania węzłów podrzędnych.

Podobnie jak metody w sekcji "Wstawianie węzłów równorzędnych", metody AppendChildElement i PrependChildElement wstawiają pojedynczy węzeł podrzędny odpowiednio na końcu i początku listy węzłów podrzędnych węzła, na którym obiekt XPathNavigator jest obecnie umieszczony, używając prefiksu przestrzeni nazw, lokalnej nazwy, identyfikatora URI przestrzeni nazw i wartości określonych jako parametry.

W poniższym przykładzie nowy pages element podrzędny jest dołączany do listy elementów podrzędnych pierwszego book elementu w contosoBooks.xml pliku.

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

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

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>

Aby uzyskać więcej informacji na temat metod AppendChild, PrependChild, AppendChildElement i PrependChildElement, zobacz dokumentację referencyjną klasy XPathNavigator.

Wstawianie węzłów atrybutów

Klasa XPathNavigator udostępnia następujące metody wstawiania węzłów atrybutów.

Te metody wstawiają węzły atrybutów do węzła elementu XPathNavigator, na którym obecnie znajduje się obiekt. Metoda CreateAttribute tworzy węzeł atrybutu na węźle elementu, na którym obiekt jest obecnie umieszczony, przy użyciu prefiksu przestrzeni nazw, nazwy lokalnej, identyfikatora URI przestrzeni nazw i wartości określonych jako parametry. Metoda CreateAttributes zwraca XmlWriter obiekt używany do wstawiania węzłów atrybutów.

W poniższym przykładzie nowe discount i currency atrybuty są tworzone na elemencie podrzędnym pierwszego price elementu w pliku book przy użyciu obiektu contosoBooks.xml zwróconego z metody XmlWriter.

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

XmlWriter attributes = navigator.CreateAttributes();

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

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

Dim attributes As XmlWriter = navigator.CreateAttributes()

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

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

Aby uzyskać więcej informacji na temat metod CreateAttribute i CreateAttributes, zobacz dokumentację referencyjną klasy XPathNavigator.

Kopiowanie węzłów

W niektórych przypadkach możesz wypełnić dokument XML zawartością innego dokumentu XML. Zarówno XPathNavigator klasa, jak i XmlWriter klasa mogą kopiować węzły do obiektu XmlDocument z istniejącego obiektu XmlReader lub obiektu XPathNavigator.

Metody AppendChild, PrependChild, InsertBefore i InsertAfter klasy XPathNavigator mają przeciążenia, które mogą akceptować obiekt XPathNavigator lub obiekt XmlReader jako parametr.

Metoda WriteNode klasy XmlWriter ma przeciążenia, które mogą akceptować obiekt XmlNode, XmlReader lub XPathNavigator.

Poniższy przykład kopiuje wszystkie book elementy z jednego dokumentu do innego.

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

Wstawianie wartości

Klasa XPathNavigator udostępnia metody SetValue i SetTypedValue do wstawiania wartości dla węzła do obiektu XmlDocument.

Wstawianie nietypowanych 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. Wartość jest wstawiana bez żadnego typu lub bez sprawdzania, czy nowa wartość jest prawidłowa zgodnie z typem węzła, jeśli są dostępne informacje o schemacie.

W poniższym przykładzie metoda SetValue służy do aktualizowania wszystkich elementów price w pliku contosoBooks.xml.

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

XmlNamespaceManager manager = new XmlNamespaceManager(navigator.NameTable);
manager.AddNamespace("bk", "http://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);
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", "http://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)

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>

Wstawianie 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.

Poniższy przykład próbuje ustawić wartość elementu price pierwszego elementu book w pliku contosoBooks.xml na wartość DateTime. Ponieważ typ schematu price XML elementu jest zdefiniowany jako xs:decimal w contosoBooks.xsd plikach, powoduje to wyjątek.

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

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>

Przykład przyjmuje contosoBooks.xsd również jako dane wejściowe.

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://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>

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 wstawiania węzłów i wartości w dokumencie XML. Aby uzyskać więcej informacji na temat używania właściwości InnerXml i OuterXml do wstawiania węzłów i wartości, zobacz temat Modyfikowanie danych XML przy użyciu klasy XPathNavigator.

Konflikty przestrzeni nazw i xml:lang

Niektóre konflikty związane z zakresem przestrzeni nazw i xml:lang deklaracji mogą wystąpić podczas wstawiania danych XML przy użyciu metod InsertBefore, InsertAfter, AppendChild i PrependChild klasy XPathNavigator, które przyjmują obiekty XmlReader jako parametry.

Poniżej przedstawiono możliwe konflikty przestrzeni nazw.

  • Jeśli istnieje przestrzeń nazw w zakresie w XmlReader kontekście obiektu, gdzie prefiks mapowania identyfikatora URI przestrzeni nazw nie znajduje się w XPathNavigator kontekście obiektu, do nowo wstawionego węzła zostanie dodana nowa deklaracja przestrzeni nazw.

  • Jeśli ten sam identyfikator URI przestrzeni nazw jest obecny zarówno w kontekście obiektu XmlReader, jak i XPathNavigator, ale ma inny prefiks zamapowany w obu kontekstach, nowa deklaracja przestrzeni nazw zostanie dodana do nowo wstawionego węzła, a prefiks i identyfikator URI przestrzeni nazw zostaną pobrane z obiektu XmlReader.

  • Jeśli ten sam prefiks przestrzeni nazw jest w zakresie zarówno w kontekście obiektu XmlReader, jak i obiektu XPathNavigator, ale w obu kontekstach ma przypisany inny identyfikator URI przestrzeni nazw, do nowo wstawionego węzła zostaje dodana nowa deklaracja przestrzeni nazw. Deklaracja ta ponownie deklaruje ten prefiks, używając identyfikatora URI przestrzeni nazw pobranego z obiektu XmlReader.

  • Jeśli prefiks oraz identyfikator URI przestrzeni nazw są takie same zarówno w kontekście obiektu XmlReader, jak i obiektu XPathNavigator, do nowo wstawionego węzła nie zostanie dodana żadna nowa deklaracja przestrzeni nazw.

Uwaga / Notatka

Powyższy opis dotyczy również deklaracji przestrzeni nazw z pustym string prefiksem (na przykład domyślną deklaracją przestrzeni nazw).

Poniżej przedstawiono możliwe xml:lang konflikty.

  • Jeśli w kontekście obiektu xml:lang istnieje XmlReader atrybut, ale nie istnieje w kontekście obiektu XPathNavigator, dodawany jest atrybut xml:lang, którego wartość jest pobierana z obiektu XmlReader do nowo wstawionego węzła.

  • Jeśli w zakresie kontekstu zarówno obiektu xml:lang, jak i obiektu XmlReader znajduje się atrybut XPathNavigator, ale atrybuty mają różne wartości, atrybut xml:lang, którego wartość pochodzi z obiektu XmlReader, jest dodawany do nowo utworzonego węzła.

  • Jeśli atrybut xml:lang jest w zakresie zarówno kontekstu obiektu XmlReader, jak i kontekstu obiektu XPathNavigator, ale każdy z nich ma tę samą wartość, nowy atrybut xml:lang nie jest dodawany do nowo wstawionego węzła.

  • Jeśli istnieje xml:lang atrybut w zakresie w XPathNavigator kontekście obiektu, ale żaden nie istnieje w XmlReader kontekście obiektu, to żaden xml:lang atrybut nie zostanie dodany do nowo wstawionego węzła.

Wstawianie węzłów za pomocą narzędzia XmlWriter

Metody używane do wstawiania węzłów równorzędnych, podrzędnych i atrybutów opisanych w sekcji "Wstawianie węzłów i wartości" są przeciążone. Metody InsertAfter, InsertBefore, AppendChild, PrependChild i CreateAttributes klasy XPathNavigator zwracają obiekt XmlWriter używany do wstawiania węzłów.

Nieobsługiwane metody XmlWriter

Nie wszystkie metody używane do pisania informacji w dokumencie XML przy użyciu XmlWriter klasy są obsługiwane przez XPathNavigator klasę ze względu na różnicę między modelem danych XPath a modelem obiektów dokumentów (DOM).

W poniższej tabeli opisano metody klasy XmlWriter, które nie są obsługiwane przez klasę XPathNavigator.

Metoda Opis
WriteEntityRef Zgłasza wyjątek NotSupportedException .
WriteDocType Ignorowane na poziomie głównym i zgłasza wyjątek, jeśli jest wywoływane na jakimkolwiek innym poziomie w dokumencie XML.
WriteCData Traktowane jako wywołanie metody WriteString dla równoważnego znaku lub znaków.
WriteCharEntity Traktowane jako wywołanie metody WriteString dla równoważnego znaku lub znaków.
WriteSurrogateCharEntity Traktowane jako wywołanie metody WriteString dla równoważnego znaku lub znaków.

Aby uzyskać więcej informacji na temat klasy, zobacz dokumentację referencyjną XmlWriterXmlWriter klas.

Wiele obiektów XmlWriter

Istnieje możliwość posiadania wielu XPathNavigator obiektów wskazujących na różne części dokumentu XML z co najmniej jednym otwartym XmlWriter obiektem. Wiele XmlWriter obiektów jest dozwolonych i obsługiwanych w scenariuszach jednowątkowych.

Poniżej przedstawiono ważne uwagi, które należy wziąć pod uwagę podczas korzystania z wielu XmlWriter obiektów.

  • Fragmenty XML zapisywane przez XmlWriter obiekty są dodawane do dokumentu XML po wywołaniu Close metody każdego XmlWriter obiektu. Obiekt XmlWriter do tego momentu zapisuje odłączony fragment. Jeśli na dokumencie XML zostanie wykonana operacja, wszystkie fragmenty zapisywane przez obiekt XmlWriter, przed wywołaniem Close, nie są zmieniane.

  • Jeśli istnieje otwarty XmlWriter obiekt w określonym poddrzewie XML i to poddrzewo zostanie usunięte, XmlWriter obiekt może nadal zostać dodany do poddrzewa. Poddrzewo po prostu staje się usuniętym fragmentem.

  • Jeśli wiele XmlWriter obiektów jest otwieranych w tym samym punkcie dokumentu XML, są one dodawane do dokumentu XML w kolejności, w której XmlWriter obiekty są zamknięte, a nie w kolejności, w jakiej zostały otwarte.

Poniższy przykład tworzy obiekt XmlDocument, następnie obiekt XPathNavigator, a potem używa obiektu XmlWriter zwróconego przez metodę PrependChild, aby utworzyć strukturę pierwszej książki w pliku books.xml. Następnie przykład zapisuje go jako book.xml plik.

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

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