Вставка 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, см. в руководстве по созданию и сохранению документов.

См. также