Поделиться через


Вставка XML-данных с помощью XPathNavigator

Класс XPathNavigator предоставляет набор методов, используемых для вставки соседних, дочерних и атрибутных узлов в XML-документе. Чтобы использовать эти методы, XPathNavigator объект должен быть редактируемым, то есть его CanEdit свойство должно быть true.

XPathNavigator объекты, которые могут изменять XML-документ, создаются методом CreateNavigatorXmlDocument класса. 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 = 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 = 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 создает узел атрибута на узле элемента, на котором в настоящее время расположен объект, используя префикс пространства имен, локальное имя, URI пространства имен и значение, указанные в качестве параметров. Метод CreateAttributes возвращает объект, используемый XmlWriter для вставки узлов атрибутов.

В следующем примере новые discount и currency атрибуты создаются на price дочернем элементе первого book элемента в contosoBooks.xml файле с помощью XmlWriter объекта, возвращаемого методом CreateAttributes .

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 = 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 в XML-схеме определяется как xs:decimal в файлах 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 узлов, на которые в настоящее время размещается объект, а также на текущем узле.

Помимо методов, описанных в этом разделе, свойства InnerXml и OuterXml можно использовать для вставки узлов и значений в XML-документ. Дополнительные сведения об использовании InnerXml и OuterXml свойствах для вставки узлов и значений см. в разделе " Изменение XML-данных с помощью XPathNavigator ".

Пространство имен и конфликты "xml:lang"

Некоторые конфликты, связанные с объёмом пространства имен и xml:lang объявлений, могут возникать при вставке XML-данных с помощью методов 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 его нет, то атрибут xml:lang, значение которого берется из объекта XmlReader, добавляется к недавно вставленному узлу.

  • Если 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 .

Метод Описание
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 объект может по-прежнему добавляться в поддерево. Поддерево просто-напросто становится фрагментом, который был удален.

  • Если несколько XmlWriter объектов открываются в одной точке XML-документа, они добавляются в 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 в объект, см. в разделе "Сохранение и запись документа".

См. также