Compartilhar via


Dados XML de inserção usando XPathNavigator

A classe de XPathNavigator fornece um conjunto de métodos usados para irmão, o filho, e nós de atributo de inserção em um documento XML. Para usar esses métodos, o objeto XPathNavigator deve ser editável, ou seja, sua propriedade CanEdit deve ser true.

Os objetos XPathNavigator que podem editar um documento XML são criados pelo método CreateNavigator da classe XmlDocument. os objetos deXPathNavigator criados pela classe de XPathDocument são somente leitura e qualquer tentativa de usar os métodos de um objeto de XPathNavigator criado por XPathDocument objetos resultados em NotSupportedException.

Para saber mais sobre como criar objetos XPathNavigator editáveis, confira Leitura de dados XML usando XPathDocument e XmlDocument.

Inserindo nós

A classe de XPathNavigator fornece métodos para irmão, o filho, e nós de atributo de inserção em um documento XML. Esses métodos permitem que você insira nós e atributos em locais diferentes com relação a posição atual de XPathNavigator objeto e são descritas nas seções.

Inserindo nós irmãos

A classe de XPathNavigator fornece os seguintes métodos para nós irmãos de inserção.

Esses nós irmãos de inserção dos métodos antes e após o nó um objeto de XPathNavigator é posicionado atualmente.

Os métodos de InsertAfter e de InsertBefore são sobrecarregados e aceitam string, um objeto de XmlReader , ou um objeto de XPathNavigator que contém o nó irmãos para adicionar como parâmetros. Ambos os métodos também retornam um objeto de XmlWriter usado para nós irmãos de inserção.

Os métodos de InsertElementAfter e de InsertElementBefore inserirem um único nó irmãos antes e após o nó que um objeto de XPathNavigator é posicionado atualmente em usar o prefixo do namespace, o nome local, URI de namespace, e o valor especificado como parâmetros.

No exemplo a seguir um novo elemento de pages é inserido antes que o elemento filho de price do primeiro elemento de book no arquivo de 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)

O exemplo usa o arquivo contosoBooks.xml como entrada.

<?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>

Para obter mais informações sobre a InsertAfter, InsertBefore, InsertElementAfter e métodos de InsertElementBefore , consulte a documentação de referência da classe XPathNavigator .

Inserindo nós filho

A classe de XPathNavigator fornece os seguintes métodos para nós filho de inserção.

Esses métodos append preceda e nós filho ao final de e a lista de nós filho do nó um objeto de XPathNavigator é posicionado atualmente.

Como os métodos “que inserção na seção de nós irmãos”, AppendChild e métodos de PrependChild aceitam string, um objeto de XmlReader , ou um objeto de XPathNavigator que contém o nó filho para adicionar como parâmetros. Ambos os métodos também retornam um objeto de XmlWriter usado para nós filho de inserção.

Também como os métodos “que inserção na seção de nós irmãos”, AppendChildElement e métodos de PrependChildElement inserirem um único nó filho e fim da lista de nós filho do nó um objeto de XPathNavigator é posicionado atualmente em usar o prefixo de namespace, o nome local, o URI de namespace, e o valor especificado como parâmetros.

No exemplo a seguir, um novo elemento filho de pages é acrescentado à lista de elementos filho do primeiro elemento de book no arquivo de 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)

O exemplo usa o arquivo contosoBooks.xml como entrada.

<?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>

Para obter mais informações sobre a AppendChild, PrependChild, AppendChildElement e métodos de PrependChildElement , consulte a documentação de referência da classe XPathNavigator .

Inserindo nós de atributo

A classe de XPathNavigator fornece os seguintes métodos para nós de atributo de inserção.

Esses nós de atributo de inserção dos métodos no nó do elemento um objeto de XPathNavigator são posicionados atualmente. O método de CreateAttribute cria um nó de atributo no nó do elemento de XPathNavigator um objeto é posicionado atualmente em usar o prefixo do namespace, o nome local, o URI de namespace, e o valor especificado como parâmetros. O método de CreateAttributes retorna um objeto de XmlWriter usado para nós de atributo de inserção.

No exemplo a seguir, um novo discount e atributos de currency são criados no elemento filho de price do primeiro elemento de book no arquivo de contosoBooks.xml usando o objeto de XmlWriter retornado pelo método de 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)

O exemplo usa o arquivo contosoBooks.xml como entrada.

<?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>

Para obter mais informações sobre métodos de CreateAttribute e de CreateAttributes , consulte a documentação de referência da classe XPathNavigator .

Copiando nós

Em alguns casos você pode desejar preencher um documento XML com o conteúdo de um outro documento XML. Ambas a classe de XPathNavigator e a classe de XmlWriter podem copiar nós em um objeto de XmlDocument de um objeto existente de XmlReader ou do objeto de XPathNavigator .

Todos AppendChild, PrependChild, InsertBefore e métodos de InsertAfter de XPathNavigator classe tem sobrecargas que podem aceitar um objeto de XPathNavigator ou um objeto de XmlReader como um parâmetro.

O método de WriteNode da classe de XmlWriter possui sobrecargas que podem aceitar XmlNode, XmlReader, ou o objeto de XPathNavigator .

O exemplo a seguir copia todos os elementos de book de um documento para outro.

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");  

Inserindo valores

A classe de XPathNavigator fornece SetValue e métodos de SetTypedValue a valores de inserção para um nó em XmlDocument objeto.

Inserindo valores sem tipo

O método SetValue simplesmente insere o valor sem tipo de string passado como um parâmetro como o valor do nó no qual o objeto XPathNavigator está posicionado no momento. O valor é inserido sem nenhum tipo ou sem verificar se o novo valor é válido de acordo com o tipo de nó se as informações do esquema estiverem disponíveis.

No exemplo a seguir, o método SetValue é usado para atualizar todos os elementos price no arquivo 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)

O exemplo usa o arquivo contosoBooks.xml como entrada.

<?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>

Inserindo valores tipados

Quando o tipo de um nó é um tipo simples de Esquema XML do W3C, o novo valor inserido pelo método SetTypedValue é verificado em relação às facetas do tipo simples antes que o valor seja definido. Se o novo valor não for válido de acordo com o tipo de nó (por exemplo, definir um valor de -1 em um elemento cujo tipo seja xs:positiveInteger), isso resultará em uma exceção.

O exemplo a seguir tenta alterar o valor do elemento price do primeiro elemento book no arquivo contosoBooks.xml para um valor DateTime. Como o tipo de esquema XML do elemento price está definido como xs:decimal nos arquivos contosoBooks.xsd, isso resulta em uma exceção.

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);  

O exemplo usa o arquivo contosoBooks.xml como entrada.

<?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>

O exemplo também usa contosoBooks.xsd como entrada.

<?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>

As propriedades de InnerXml e de OuterXml

As propriedades InnerXml e OuterXml da classe XPathNavigator alteram a marcação XML dos nós nos quais um objeto XPathNavigator está posicionado no momento.

A propriedade InnerXml altera a marcação XML dos nós filho no qual um objeto XPathNavigator está posicionado no momento com o conteúdo analisado da string do XML determinada. Da mesma maneira, a propriedade OuterXml altera a marcação XML dos nós filho no qual um objeto XPathNavigator está posicionado no momento além do próprio nó atual.

Além dos métodos descritos neste tópico, InnerXml e as propriedades de OuterXml podem ser usados para inserir nós e valores em um documento XML. Para saber mais sobre como usar as propriedades InnerXml e OuterXml para inserir nós e valores, confira o tópico Modificar dados XML usando XPathNavigator.

Namespace e XML: conflitos de idioma

Alguns conflitos relacionados ao escopo de namespace e declarações de xml:lang podem ocorrer ao inserir dados XML usando InsertBefore, InsertAfter, AppendChild e métodos de PrependChild de XPathNavigator classe que utiliza objetos de XmlReader como parâmetros.

Estes são os conflitos possíveis de namespace.

  • Se houver um em- escopo de namespace no contexto de objeto de XmlReader , onde o prefixo para mapear URI de namespace não está no contexto de objeto de XPathNavigator , uma nova declaração de namespace é adicionada ao nó recentemente inserido.

  • Se o mesmo URI de namespace é em- escopo dentro do contexto de objeto de XmlReader e o contexto de objeto de XPathNavigator , mas tem um prefixo diferente mapeado a ele em ambos os contextos, uma nova declaração de namespace é adicionada ao nó recentemente inserido, com o prefixo e o URI de namespace tirado de XmlReader objetos.

  • Se o mesmo prefixo de namespace é em- escopo dentro do contexto de objeto de XmlReader e o contexto de objeto de XPathNavigator , mas tem URI diferente de um namespace mapeado a ele em ambos os contextos, uma nova declaração de namespace é adicionada ao nó recentemente inserido que a declara que um URI com o prefixo do namespace extraído do objeto de XmlReader .

  • Se o prefixo bem como o URI de namespace no contexto de objeto de XmlReader e no contexto de objeto de XPathNavigator são o mesmo, nenhuma nova declaração de namespace é adicionada ao nó recentemente inserido.

Observação

A descrição anterior também se aplica às declarações namespace com string vazia como um prefixo (por exemplo, a declaração de namespace padrão).

Estes são os conflitos possíveis de xml:lang .

  • Se houver um em- escopo de atributo de xml:lang dentro do contexto de objeto de XmlReader mas não no contexto de objeto de XPathNavigator , um atributo de xml:lang cujo valor é extraído do objeto de XmlReader é adicionado ao nó recentemente inserido.

  • Se houver um em- escopo de atributo de xml:lang dentro do contexto de objeto de XmlReader e o contexto de objeto de XPathNavigator , mas cada um possui um valor diferente, um atributo de xml:lang cujo valor é extraído do objeto de XmlReader é adicionado ao nó recentemente inserido.

  • Se houver um em- escopo de atributo de xml:lang dentro do contexto de objeto de XmlReader e o contexto de objeto de XPathNavigator , mas cada um com o mesmo valor, nenhum novo atributo de xml:lang é adicionado no nó recentemente inserido.

  • Se houver um em- escopo de atributo de xml:lang dentro do contexto de objeto de XPathNavigator , mas nenhum que existem no contexto de objeto de XmlReader , nenhum atributo de xml:lang é adicionado ao nó recentemente inserido.

Inserindo nós com XmlWriter

Os métodos usados para inserir o irmão, o filho e os nós de atributo “inserindo descritos na seção de nós e valores são sobrecarregados.” InsertAfter, InsertBefore, AppendChild, PrependChild e métodos de CreateAttributes da classe de XPathNavigator retornam um objeto de XmlWriter usado para nós de inserção.

Métodos sem suporte de XmlWriter

Nem todos os métodos usados para gravar informações em um documento XML que usa a classe de XmlWriter são suportados pela classe de XPathNavigator devido a diferença entre o modelo de dados XPath e o Document Object Model (DOM).

A tabela a seguir descreve os métodos da classe XmlWriter não suportados pela classe de XPathNavigator .

Método Descrição
WriteEntityRef Gerencie uma exceção de NotSupportedException .
WriteDocType Ignorado no nível raiz e em gera uma exceção de NotSupportedException se chamado em qualquer outro o nível no documento XML.
WriteCData Tratado como uma chamada para o método de WriteString para o caractere ou os caracteres equivalentes.
WriteCharEntity Tratado como uma chamada para o método de WriteString para o caractere ou os caracteres equivalentes.
WriteSurrogateCharEntity Tratado como uma chamada para o método de WriteString para o caractere ou os caracteres equivalentes.

Para obter mais informações sobre a classe de XmlWriter , consulte a documentação de referência da classe XmlWriter .

Vários objetos de XmlWriter

É possível ter vários objetos de XPathNavigator que apontam para partes diferentes de um documento XML com um ou mais objetos abertos de XmlWriter . Vários objetos de XmlWriter são permitidos e suportados em cenários de único thread.

Os seguintes são notas importantes a considerar ao usar vários XmlWriter objeto.

  • Os fragmentos XML escritos por objetos de XmlWriter são adicionados ao documento XML quando o método de Close de cada objeto de XmlWriter é chamado. Até esse ponto, o objeto de XmlWriter estiver escrevendo um fragmento desconectados. Se uma operação é executada no documento XML, quaisquer informações que estão sendo gravados por um objeto de XmlWriter , antes que Close é chamado, não são afetados.

  • Se houver um objeto de abertura de XmlWriter em uma subárvore específico XML e a subárvore é excluída, o objeto de XmlWriter ainda pode adicionar à subárvore. A subárvore transformações somente um fragmento excluído.

  • Se vários objetos de XmlWriter são abertos no mesmo ponto no documento XML, são adicionados ao documento XML na ordem em que os objetos de XmlWriter são fechados, não na ordem em que foram abertos.

O seguinte exemplo cria um objeto de XmlDocument , cria um objeto de XPathNavigator em seguida, usa o objeto de XmlWriter retornado pelo método de PrependChild para criar a estrutura do primeiro livro no arquivo de books.xml . O exemplo salvá-los em como o arquivo de 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");  

Salvando um documento XML

Salvando as alterações feitas a um objeto de XmlDocument como resultado dos métodos descritos neste tópico é executado usando os métodos da classe XmlDocument . Para saber mais sobre como salvar as alterações feitas em um objeto XmlDocument, confira Salvar e gravar um documento.

Confira também