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

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 wstawią węzły równorzędne przed węzłem XPathNavigator i po nim, w których obecnie znajduje się 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ą XmlWriter również obiekt używany do wstawiania węzłów równorzędnych.

Metody InsertElementAfter i InsertElementBefore wstawią jeden węzeł równorzędny przed i po węźle XPathNavigator obiekt jest obecnie umieszczony przy użyciu prefiksu przestrzeni nazw, nazwy lokalnej, identyfikatora URI przestrzeni nazw i wartości określonej 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 = gcnew 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);
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 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>

Aby uzyskać więcej informacji na temat InsertAftermetod , InsertBeforeInsertElementAfter iInsertElementBefore, zobacz dokumentację referencyjną XPathNavigator klas.

Wstawianie węzłów podrzędnych

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

Te metody dołączają i poprzedzają węzły podrzędne na końcu i na początku listy węzłów podrzędnych węzła XPathNavigator , na których jest obecnie umieszczony obiekt.

Podobnie jak metody w sekcji "Wstawianie węzłów równorzędnych", AppendChild metody i PrependChild akceptują stringobiekt , XmlReader lub XPathNavigator obiekt zawierający węzeł podrzędny, aby dodać jako parametry. Obie metody zwracają XmlWriter również obiekt używany do wstawiania węzłów podrzędnych.

Podobnie jak metody w sekcji "Wstawianie węzłów równorzędnych", AppendChildElement metody i PrependChildElement wstawią jeden węzeł podrzędny na końcu i początek listy węzłów podrzędnych węzłów węzłów XPathNavigator podrzędnych, w których obiekt jest obecnie umieszczony przy użyciu prefiksu przestrzeni nazw, lokalnej nazwy, identyfikatora URI przestrzeni nazw i wartości określonej 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 = gcnew 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);
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 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>

Aby uzyskać więcej informacji na temat AppendChildmetod , PrependChildAppendChildElement iPrependChildElement, zobacz dokumentację referencyjną XPathNavigator klas.

Wstawianie węzłów atrybutów

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

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

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

XmlDocument^ document = gcnew 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);
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 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>

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

Kopiowanie węzłów

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

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

Metoda WriteNodeXmlWriter klasy ma przeciążenia, które mogą akceptować XmlNodeobiekt , XmlReaderlub 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 SetValue metody i SetTypedValue do wstawiania wartości dla węzła XmlDocument do obiektu.

Wstawianie 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. 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 SetValue metoda służy do aktualizowania wszystkich price elementów w contosoBooks.xml pliku.

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

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

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 zmienić wartość price elementu pierwszego book elementu w contosoBooks.xml pliku na DateTime wartość. 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 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>

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

Przestrzeń nazw i xml:lang Konflikty

Niektóre konflikty związane z zakresem przestrzeni nazw i xml:lang deklaracji mogą wystąpić podczas wstawiania danych XML przy użyciu InsertBeforemetody XPathNavigator , InsertAfterAppendChild i PrependChild klasy, które przyjmują XmlReader obiekty 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 w zakresie zarówno w XmlReader kontekście obiektu, jak i XPathNavigator w kontekście obiektu, ale ma inny prefiks zamapowany w obu kontekstach, nowa deklaracja przestrzeni nazw zostanie dodana do nowo wstawionego węzła z prefiksem i identyfikatorem URI przestrzeni nazw pobranym z XmlReader obiektu.

  • Jeśli ten sam prefiks przestrzeni nazw jest w zakresie zarówno XmlReader w kontekście obiektu, jak i XPathNavigator w kontekście obiektu, ale ma inny identyfikator URI przestrzeni nazw mapowany w obu kontekstach, nowa deklaracja przestrzeni nazw jest dodawana do nowo wstawionego węzła, który ponownie deklaruje ten prefiks z identyfikatorem URI przestrzeni nazw pobranym z XmlReader obiektu.

  • Jeśli prefiks, a także identyfikator URI przestrzeni nazw w XmlReader kontekście obiektu i XPathNavigator kontekst obiektu jest taki sam, do nowo wstawionego węzła nie zostanie dodana żadna nowa deklaracja przestrzeni nazw.

Uwaga

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 istnieje xml:lang atrybut w zakresie w XmlReader kontekście obiektu, ale nie w XPathNavigator kontekście obiektu, atrybut, którego wartość jest pobierana z XmlReader obiektu, xml:lang jest dodawany do nowo wstawionego węzła.

  • Jeśli istnieje xml:lang atrybut w zakresie zarówno XmlReader kontekstu obiektu, jak i XPathNavigator kontekstu obiektu, ale każda z nich ma inną wartość, atrybut, xml:lang którego wartość jest pobierana z XmlReader obiektu, jest dodawany do nowo wstawionego węzła.

  • Jeśli istnieje xml:lang atrybut w zakresie zarówno XmlReader kontekstu obiektu, jak i XPathNavigator kontekstu obiektu, ale każdy z tą samą wartością, żaden nowy xml:lang atrybut nie zostanie dodany w nowo wstawionym węźle.

  • Jeśli istnieje xml:lang atrybut w zakresie w XPathNavigator kontekście obiektu, ale żaden z nich nie istnieje w XmlReader kontekście obiektu, żaden atrybut nie xml:lang 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 InsertAfterXPathNavigator , InsertBefore, AppendChildPrependChild i CreateAttributes klasy zwracają XmlWriter obiekt 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 XmlWriter metody klas, 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ływany NotSupportedException na dowolnym innym poziomie w dokumencie XML.
WriteCData Traktowane jako wywołanie WriteString metody dla równoważnego znaku lub znaków.
WriteCharEntity Traktowane jako wywołanie WriteString metody dla równoważnego znaku lub znaków.
WriteSurrogateCharEntity Traktowane jako wywołanie WriteString metody 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ść, że istnieje wiele XPathNavigator obiektów wskazujących różne części dokumentu XML z co najmniej jednym otwartymi XmlWriter obiektami. 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. Do tego momentu XmlWriter obiekt zapisuje odłączony fragment. Jeśli operacja jest wykonywana w dokumencie XML, wszystkie fragmenty zapisywane przez XmlWriter obiekt, przed Close wywołaniem obiektu, nie mają wpływu.

  • 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 XmlDocument obiekt, tworzy XPathNavigator obiekt, a następnie używa XmlWriter obiektu zwróconego przez PrependChild metodę w celu utworzenia struktury pierwszej książki w books.xml pliku. 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 też