Вставка XML-данных с помощью XPathNavigator
Класс XPathNavigator предоставляет набор методов для вставки в XML-документ одноуровневых узлов, дочерних узлов и узлов атрибутов. Для использования этих методов необходимо сделать редактируемым объект XPathNavigator, то есть установить для свойства CanEdit значение true
.
Объекты XPathNavigator для правки XML-документа создаются с помощью метода CreateNavigator класса XmlDocument. Объекты XPathNavigator, созданные классом XPathDocument, доступны только для чтения, и любая попытка вызова методов редактирования объекта XPathNavigator, созданного объектом XPathDocument, приводит к возникновению исключения NotSupportedException.
Дополнительные сведения о доступных только для чтения и изменяемых объектах XPathNavigator см. в руководстве по чтению данных XML с помощью XPathDocument и XmlDocument.
Вставка узлов
Класс XPathNavigator предоставляет методы для вставки в XML-документ одноуровневых узлов, дочерних узлов и узлов атрибутов. Эти методы позволяют вставить узлы и атрибуты в разные места относительно текущего положения объекта XPathNavigator и описываются в следующих разделах.
Вставка одноуровневых узлов
Класс XPathNavigator предоставляет следующие методы для вставки одноуровневых узлов.
Эти методы вставляют одноуровневые узлы до и после узла, на котором располагается объект XPathNavigator.
Методы InsertAfter и InsertBefore перегружаются и принимают в качестве параметров объект string
, XmlReader или объект XPathNavigator, содержащий одноуровневый узел. Оба метода также возвращают объект XmlWriter, используемый для вставки одноуровневых узлов.
Методы InsertElementAfter и InsertElementBefore вставляют один одноуровневый узел до и после узла, на котором располагается объект XPathNavigator, используя префикс пространства имен, локальное имя, URI-код пространства имен и значение, указанное в параметрах.
В следующем примере новый элемент pages
вставляется перед дочерним элементом price
первого элемента book
в файле contosoBooks.xml
.
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)
В примере в качестве входных данных используется файл contosoBooks.xml
.
<?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>
Дополнительные сведения о методах InsertAfter, InsertBefore, InsertElementAfter и InsertElementBefore см. в справочной документации по классу XPathNavigator.
Вставка дочерних узлов
Класс XPathNavigator предоставляет следующие методы для вставки дочерних узлов.
Эти методы вставляют дочерние узлы в конец и в начало списка дочерних узлов того узла, на котором в текущий момент располагается объект XPathNavigator.
Подобно методам из раздела «Вставка одноуровневых узлов», методы AppendChild и PrependChild принимают в качестве параметров объект string
, XmlReader или объект XPathNavigator, содержащий дочерний узел. Оба метода также возвращают объект XmlWriter, используемый для вставки дочерних узлов.
Также, подобно методам из раздела «Вставка одноуровневых узлов», методы AppendChildElement и PrependChildElement вставляют один дочерний узел в начало и конец списка дочерних узлов узла, на котором в текущий момент располагается объект XPathNavigator, используя в качестве параметров префикс пространства имен, локальное имя, URI-код пространства имен и значение, указанное в параметрах.
В следующем примере новый элемент pages
добавляется в список дочерних элементов первого элемента book
в файле contosoBooks.xml
.
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)
В примере в качестве входных данных используется файл contosoBooks.xml
.
<?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>
Дополнительные сведения о методах AppendChild, PrependChild, AppendChildElement и PrependChildElement см. в справочной документации по классу XPathNavigator.
Вставка узлов атрибутов
Класс XPathNavigator предоставляет следующие методы для вставки узлов атрибутов.
Эти методы вставляют узлы атрибутов в узел элемента, на котором в текущий момент находится объект XPathNavigator. Метод CreateAttribute создает узел атрибута для элемента узла, на котором в текущий момент располагается объект XPathNavigator, используя в качестве параметров префикс пространства имен, локальное имя, URI-код пространства имен и указанное значение. Метод CreateAttributes возвращает объект XmlWriter, используемый для вставки узлов атрибутов.
В следующем примере создаются новые атрибуты discount
и currency
для дочернего элемента price
первого элемента book
в файле contosoBooks.xml
с использованием объекта XmlWriter, возвращаемого методом CreateAttributes.
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)
В примере в качестве входных данных используется файл contosoBooks.xml
.
<?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>
Дополнительные сведения о методах CreateAttribute и CreateAttributes см. в справочной документации по классу XPathNavigator.
Копирование узлов
В некоторых случаях необходимо заполнить XML-документ содержимым другого XML-документа. Оба класса, XPathNavigator и XmlWriter, могут копировать узлы в объект XmlDocument из существующего объекта XmlReader или объекта XPathNavigator.
Методы AppendChild, PrependChild, InsertBefore и InsertAfter класса XPathNavigator имеют перегруженные варианты, которые могут принимать в качестве параметра объект XPathNavigator или объект XmlReader.
Метод WriteNode класса XmlWriter имеет перегруженные варианты, которые могут принимать объекты XmlNode, XmlReader или XPathNavigator.
В следующем примере выполняется копирование всех элементов book
из одного документа в другой.
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");
Вставка значений
Класс XPathNavigator предоставляет методы SetValue и SetTypedValue, чтобы вставить значения для узла в объект XmlDocument.
Вставка нетипизированных значений
Метод SetValue просто вставляет нетипизированное значение string
, переданное в качестве параметра, как значение узла, на котором в данный момент позиционируется объект XPathNavigator. Значение вставляется без какого-либо типа и без проверки допустимости нового значения в соответствии с типом узла, если доступны сведения о схеме.
В следующем примере метод SetValue используется для обновления всех элементов price
в файле contosoBooks.xml
.
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)
В примере в качестве входных данных используется файл contosoBooks.xml
.
<?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>
Вставка типизированных значений
Когда тип узла является простым типом XML-схемы W3C, новое значение, вставленное методом SetTypedValue, проверяется по особенностям простого типа, прежде чем будет установлено значение. Если новое значение недопустимо в соответствии с типом узла (например, при установке значения -1
для элемента с типом xs:positiveInteger
), возникает исключение.
В следующем примере предпринимается попытка изменить значение элемента price
первого элемента book
в файле contosoBooks.xml
на DateTime. Так как в файлах price
тип элемента xs:decimal
по XML-схеме определен как contosoBooks.xsd
, возникает исключение.
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);
В примере в качестве входных данных используется файл contosoBooks.xml
.
<?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>
В примере также в качестве входных данных используется contosoBooks.xsd
.
<?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>
Свойства InnerXml и OuterXml
Свойства InnerXml и OuterXml класса XPathNavigator изменяют XML-разметку узлов, на которых в данный момент позиционируется объект XPathNavigator.
Свойство InnerXml изменяет XML-разметку дочерних узлов, на которых в данный момент позиционируется объект XPathNavigator, разобранный содержимым заданной XML-строки (string
). Подобным образом свойство OuterXml изменяет XML-разметку дочерних узлов, на которых в данный момент позиционируется объект XPathNavigator, так же как и самого текущего узла.
Помимо методов, описанных в этом разделе, для вставки узлов и значений в XML-документ можно использовать свойства InnerXml и OuterXml. Дополнительные сведения об использовании свойств OuterXml и для добавления узлов и значений см. в InnerXmlруководстве по изменению данных XML с помощью XPathNavigator.
Конфликты пространства имен и деклараций xml:lang
При вставке XML-данных с помощью методов xml:lang
, InsertBefore, InsertAfter и AppendChild класса PrependChild, принимающих в качестве параметров объекты XPathNavigator, могут возникнуть определенные конфликты, связанные с областью пространства имен и деклараций XmlReader.
Ниже перечислены возможные конфликты пространства имен.
Если существует пространство имен в контексте объекта XmlReader, где префикс сопоставления URI-кода пространства имен не содержится в контексте объекта XPathNavigator, то к вновь добавленному узлу добавляется новая декларация пространства имен.
Если один и тот же URI-код пространства имен находится как в контексте объекта XmlReader, так и в контексте объекта XPathNavigator, но префиксы в различных контекстах различаются, то к вновь добавленному узлу добавляется декларация нового пространства имен, а префикс и URI-код пространства имен берутся из объекта XmlReader.
Если один и тот же префикс пространства имен находится как в контексте объекта XmlReader, так и в контексте объекта XPathNavigator, но в контекстах ему сопоставлены различные URI-коды пространств имен, то к вновь добавленному узлу добавляется декларация нового пространства имен, а префикс и URI-код пространства имен берутся из объекта XmlReader.
Если и префикс, и URI-код пространства имен в обоих контекстах объекта XmlReader и объекта XPathNavigator одинаковы, то к вновь добавленному узлу декларация нового пространства имен не добавляется.
Примечание.
Приведенное выше описание применимо также к декларациям пространства имен с пустой строкой string
в качестве префикса (например, декларация пространства имен по умолчанию).
Ниже перечислены возможные конфликты деклараций xml:lang
.
Если в контексте объекта есть
xml:lang
атрибут в XmlReader область, но не в XPathNavigator контексте объекта, атрибут, значение которого берется из XmlReader объекта,xml:lang
добавляется к только что вставленному узлу.Если атрибут
xml:lang
существует в контексте обоих объектов, XmlReader и XPathNavigator, но его значения там различаются, то к вновь добавленному узлу добавляется атрибутxml:lang
, значение которого берется из объекта XmlReader.Если атрибут
xml:lang
существует в контексте обоих объектов, XmlReader и XPathNavigator, с одинаковыми значениями, то к вновь добавленному узлу новый атрибутxml:lang
не добавляется.Если атрибут
xml:lang
существует в контексте объекта XPathNavigator, но не существует в контексте объекта XmlReader, то к вновь добавленному узлу вообще не добавляется атрибутxml:lang
.
Вставка узлов с помощью класса XmlWriter
Методы, используемые для вставки одноуровневых узлов, дочерних узлов и узлов атрибутов, которые описаны в разделе «Вставка узлов и атрибутов», перегружены. Методы InsertAfter, InsertBefore, AppendChild, PrependChild и CreateAttributes класса XPathNavigator возвращают объект XmlWriter, используемый для вставки узлов.
Неподдерживаемые методы класса XmlWriter
Не все методы, используемые для записи данных в XML-документ с помощью класса XmlWriter, поддерживаются классом XPathNavigator, что связано с различиями между моделями данных XPath и DOM.
В следующей таблице описаны методы класса XmlWriter, которые не поддерживаются в классе XPathNavigator.
Метод | Description |
---|---|
WriteEntityRef | Формирует исключение NotSupportedException. |
WriteDocType | Не обрабатывается на корневом уровне и формирует исключение NotSupportedException при вызове на любом другом уровне XML-документа. |
WriteCData | Интерпретируется как вызов метода WriteString для эквивалентного символа или символов. |
WriteCharEntity | Интерпретируется как вызов метода WriteString для эквивалентного символа или символов. |
WriteSurrogateCharEntity | Интерпретируется как вызов метода WriteString для эквивалентного символа или символов. |
Дополнительные сведения о классе XmlWriter см. в справочной документации по классу XmlWriter.
Несколько объектов XmlWriter
Можно иметь несколько объектов XPathNavigator, указывающих на различные части XML-документа с одним или более открытыми объектами XmlWriter. Использование нескольких объектов XmlWriter разрешено и поддерживается в однопоточных сценариях.
При использовании нескольких объектов XmlWriter важно учесть следующие замечания.
XML-фрагменты, созданные с помощью объекта XmlWriter, добавляются в XML-документ при вызове метода Close для каждого объекта XmlWriter. До этого момента объект XmlWriter записывает данные в отсоединенный фрагмент. Если операция выполняется на открытом XML-документе, то все фрагменты, записываемые объектом XmlWriter, не затрагиваются до вызова метода Close.
Если на определенном поддереве XML существует открытый объект XmlWriter, и поддерево удаляется, то объект XmlWriter все равно может добавляться к поддереву. Просто это поддерево становится удаленным фрагментом.
Если в одном XML-документе одновременно открыто несколько объектов XmlWriter, то они добавляются в XML-документ в порядке закрытия объектов XmlWriter, а не в порядке их открытия.
В следующем примере создается объект XmlDocument, создается объект XPathNavigator, а потом используется объект XmlWriter, возвращаемый методом PrependChild, чтобы создать структуру первой книги в файле books.xml
. Затем файл book.xml
сохраняется.
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");
Сохранение XML-документа
Сохранение изменений, внесенных в объект XmlDocument в результате выполнения описанных в данном разделе методов, выполняется с помощью методов класса XmlDocument. Дополнительные сведения о сохранении изменений, внесенных в объект XmlDocument, см. в руководстве по созданию и сохранению документов.