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ą string
obiekt , 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ą string
obiekt , 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 nowyxml: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 niexml: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.