XmlWriter.WriteNode Метод

Определение

Копирует все данные исходного объекта в текущий экземпляр средства записи.

Перегрузки

WriteNode(XmlReader, Boolean)

Когда переопределено в производном классе, копирует все данные из средства чтения в средство записи и перемещает средство чтения к началу следующего элемента того же уровня.

WriteNode(XPathNavigator, Boolean)

Копирует все из объекта XPathNavigator в средство записи. Позиция XPathNavigator остается неизменной.

Комментарии

Асинхронную версию этого метода см. в разделе WriteNodeAsync.

WriteNode(XmlReader, Boolean)

Когда переопределено в производном классе, копирует все данные из средства чтения в средство записи и перемещает средство чтения к началу следующего элемента того же уровня.

public:
 virtual void WriteNode(System::Xml::XmlReader ^ reader, bool defattr);
public virtual void WriteNode (System.Xml.XmlReader reader, bool defattr);
abstract member WriteNode : System.Xml.XmlReader * bool -> unit
override this.WriteNode : System.Xml.XmlReader * bool -> unit
Public Overridable Sub WriteNode (reader As XmlReader, defattr As Boolean)

Параметры

reader
XmlReader

Экземпляр XmlReader, из которого выполняется чтение.

defattr
Boolean

Значение true, чтобы скопировать атрибуты по умолчанию из XmlReader; в противном случае — значение false.

Исключения

reader имеет значение null.

Параметр reader содержит недопустимые символы.

Метод XmlWriter вызван перед завершением предыдущей асинхронной операции. В этом случае возникает исключение InvalidOperationException с сообщением "Асинхронная операция уже выполняется".

Примеры

В следующем примере узлы первой и последней книги записываются в консоль.

#using <System.Xml.dll>

using namespace System;
using namespace System::IO;
using namespace System::Xml;
int main()
{
   XmlTextReader^ reader = gcnew XmlTextReader( "books.xml" );
   reader->WhitespaceHandling = WhitespaceHandling::None;
   
   // Move the reader to the first book element.
   reader->MoveToContent();
   reader->Read();
   
   // Create a writer that outputs to the console.
   XmlTextWriter^ writer = gcnew XmlTextWriter( Console::Out );
   writer->Formatting = Formatting::Indented;
   
   // Write the start tag.
   writer->WriteStartElement( "myBooks" );
   
   // Write the first book.
   writer->WriteNode( reader, false );
   
   // Skip the second book.
   reader->Skip();
   
   // Write the last book.
   writer->WriteNode( reader, false );
   writer->WriteEndElement();
   
   // Close the writer and the reader.
   writer->Close();
   reader->Close();
}
using System;
using System.IO;
using System.Xml;

public class Sample{

  public static void Main(){

    XmlTextReader reader = new XmlTextReader("books.xml");
    reader.WhitespaceHandling = WhitespaceHandling.None;

    //Move the reader to the first book element.
    reader.MoveToContent();
    reader.Read();

    //Create a writer that outputs to the console.
    XmlTextWriter writer = new XmlTextWriter (Console.Out);
    writer.Formatting = Formatting.Indented;
    
    //Write the start tag.
    writer.WriteStartElement("myBooks");

    //Write the first book.
    writer.WriteNode(reader, false);

    //Skip the second book.
    reader.Skip();

    //Write the last book.
    writer.WriteNode(reader, false);
    writer.WriteEndElement();

    //Close the writer and the reader.
    writer.Close();
    reader.Close();
  }
}
Imports System.IO
Imports System.Xml

public class Sample

  public shared sub Main()

    Dim reader as XmlTextReader = new XmlTextReader("books.xml")
    reader.WhitespaceHandling = WhitespaceHandling.None

    'Move the reader to the first book element.
    reader.MoveToContent()
    reader.Read()

    'Create a writer that outputs to the console.
    Dim writer as XmlTextWriter = new XmlTextWriter (Console.Out)
    writer.Formatting = Formatting.Indented
    
    'Write the start tag.
    writer.WriteStartElement("myBooks")

    'Write the first book.
    writer.WriteNode(reader, false)

    'Skip the second book.
    reader.Skip()

    'Write the last book.
    writer.WriteNode(reader, false)
    writer.WriteEndElement()

    'Close the writer and the reader.
    writer.Close()
    reader.Close()

  end sub
end class

В этом примере файл books.xmlиспользуется в качестве входных данных.

<bookstore>
  <book genre="autobiography" publicationdate="1981" 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" 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" ISBN="1-861001-57-6">
    <title>The Gorgias</title>
    <author>
      <name>Plato</name>
    </author>
    <price>9.99</price>
  </book>
</bookstore>

Комментарии

В следующей таблице показаны поддерживаемые типы узлов для этого метода.

NodeType Поведение writeNode
None Записывает все узлы независимо от типа. То есть модуль записи использует XmlReader и записывает все узлы, включая атрибуты, инструкции по обработке, комментарии и т. д.

Эта ситуация возникает, когда XmlReader находится в начальном состоянии. (Свойство XmlReader.ReadState возвращается ReaderState.Initial).
Element Записывает узел элемента и все узлы атрибутов.
Attribute Нет операции. Вместо него следует использовать элементы WriteStartAttribute или WriteAttributeString.
Text Записывает текстовый узел.
CDATA Записывает узел раздела CDATA.
EntityReference Записывает узел ссылки на сущность.
ProcessingInstruction Записывает узел инструкции обработки.
Comment Записывает узел комментариев.
DocumentType Записывает узел типа документа.
SignificantWhitespace Записывает значительный узел пробела.
Whitespace Записывает узел пробелов.
EndElement Записывает тег конечного элемента.
EndEntity Нет операции.
XmlDeclaration Записывает узел объявления XML.

Если средство чтения находится в начальном состоянии, этот метод перемещает средство чтения в конец файла. Если средство чтения уже находится в конце файла или в закрытом состоянии, этот метод не работает.

Следующий код C# копирует весь входной XML-документ в консоль:

XmlReader reader = XmlReader.Create(myfile);  
XmlWriter writer = XmlWriter.Create(Console.Out);  
writer.WriteNode(reader, false);  

При перемещении с корневого узла и расположении в другом месте документа, приведенном в следующем примере C#, правильно записывает узлы.

XmlReader reader = XmlReader.Create(myfile);  
reader.Read(); // Read PI  
reader.Read(); // Read Comment  
reader.Read(); // Read DOCType  
XmlWriter writer = XmlWriter.Create(Console.Out);  
while (!reader.EOF){  
  writer.WriteNode(reader, false);  
 }  

Если средство чтения настроено для возврата пробелов, а модуль записи настроен для отступа, WriteNode может привести к странным выходным данным. По сути, вы получите двойное форматирование.

Асинхронную версию этого метода см. в разделе WriteNodeAsync.

Применяется к

WriteNode(XPathNavigator, Boolean)

Копирует все из объекта XPathNavigator в средство записи. Позиция XPathNavigator остается неизменной.

public:
 virtual void WriteNode(System::Xml::XPath::XPathNavigator ^ navigator, bool defattr);
public virtual void WriteNode (System.Xml.XPath.XPathNavigator navigator, bool defattr);
abstract member WriteNode : System.Xml.XPath.XPathNavigator * bool -> unit
override this.WriteNode : System.Xml.XPath.XPathNavigator * bool -> unit
Public Overridable Sub WriteNode (navigator As XPathNavigator, defattr As Boolean)

Параметры

navigator
XPathNavigator

Элемент XPathNavigator, из которого копируются данные.

defattr
Boolean

Значение true — копирование атрибутов по умолчанию; в противном случае — false.

Исключения

navigator имеет значение null.

Метод XmlWriter вызван перед завершением предыдущей асинхронной операции. В этом случае возникает исключение InvalidOperationException с сообщением "Асинхронная операция уже выполняется".

Примеры

В следующем примере используется WriteNode метод для копирования первого узла книги из документа и записи его в консоль.

using System;
using System.IO;
using System.Xml;
using System.Xml.XPath;

public class Sample
{

    public static void Main()
    {

        XPathDocument doc = new XPathDocument("books.xml");
        XPathNavigator nav = doc.CreateNavigator();

        // Create a writer that outputs to the console.
        XmlWriter writer = XmlWriter.Create(Console.Out);

        // Write the start tag.
        writer.WriteStartElement("myBooks");

        // Write the first book.
        nav.MoveToChild("bookstore", "");
        nav.MoveToChild("book", "");
        writer.WriteNode(nav, false);

        // Close the start tag.
        writer.WriteEndElement();

        // Close the writer.
        writer.Close();
    }
}
Imports System.IO
Imports System.Xml
Imports System.Xml.XPath

Module Module1

    Sub Main()

        Dim doc As XPathDocument = New XPathDocument("books.xml")
        Dim nav As XPathNavigator = doc.CreateNavigator()

        ' Create a writer that outputs to the console.
        Dim writer As XmlWriter = XmlWriter.Create(Console.Out)

        ' Write the start tag.
        writer.WriteStartElement("myBooks")

        ' Write the first book.
        nav.MoveToChild("bookstore", "")
        nav.MoveToChild("book", "")
        writer.WriteNode(nav, False)

        ' Close the start tag.
        writer.WriteEndElement()

        ' Close the writer.
        writer.Close()

    End Sub
End Module

В этом примере файл books.xml используется в качестве входных данных.

<?xml version="1.0" encoding="utf-8" ?> 
<bookstore>
    <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>

Комментарии

В следующей таблице показаны поддерживаемые XPath типы узлов для этого метода.

XPathNodeType Поведение writeNode
Root Записывает все узлы независимо от типа. То есть модуль записи использует XPathNavigator и записывает все узлы из корневого узла (включая атрибуты, инструкции по обработке, комментарии и т. д.).
Element Записывает узел элемента и все узлы атрибутов.
Attribute Нет операции. Вместо него следует использовать элементы WriteStartAttribute или WriteAttributeString.
Text Записывает текстовый узел.
Namespace Нет операции. WriteStartAttribute Используйте метод или WriteAttributeString метод для записи объявления пространства имен.
ProcessingInstruction Записывает узел инструкции обработки.
Comment Записывает узел комментариев.
SignificantWhitespace Записывает значительный узел пробела.
Whitespace Записывает узел пробелов.

Асинхронную версию этого метода см. в разделе WriteNodeAsync.

Применяется к