Compartir a través de


Inserción de datos XML con XPathNavigator

La clase XPathNavigator incluye un conjunto de métodos que se utilizan para insertar nodos de atributos, secundarios y relacionados en un documento XML. Para utilizar estos métodos, el objeto XPathNavigator debe ser editable, es decir, su propiedad CanEdit debe ser true.

El método XPathNavigator de la clase CreateNavigator crea los objetos XmlDocument que pueden editar un documento XML. Los objetos XPathNavigator que crea la clase XPathDocument son de solo lectura y cualquier intento de utilizar los métodos de edición de un objeto XPathNavigator creado por un objeto XPathDocument producirá una excepción NotSupportedException.

Para más información sobre cómo crear objetos XPathNavigator editables, vea Lectura de datos XML con XPathDocument y XmlDocument.

Inserción de nodos

La clase XPathNavigator incluye métodos que se utilizan para insertar nodos de atributos, secundarios y relacionados en un documento XML. Estos métodos permiten insertar nodos y atributos en diferentes ubicaciones en relación con la posición actual de un objeto XPathNavigator y se describen en las siguientes secciones.

Inserción de nodos relacionados

La clase XPathNavigator incluye los siguientes métodos para insertar nodos relacionados.

Estos métodos insertan nodos relacionados antes y después del nodo en el que está situado actualmente un objeto XPathNavigator.

Los métodos InsertAfter y InsertBefore están sobrecargados y aceptan un objeto string, XmlReader, o un objeto XPathNavigator que contiene el nodo relacionado para agregarlos como parámetros. Ambos métodos también devuelven un objeto XmlWriter que se utiliza para insertar nodos relacionados.

Los métodos InsertElementAfter y InsertElementBefore insertan un solo nodo relacionado antes y después del nodo en el que está situado actualmente un objeto XPathNavigator, utilizando como parámetros el prefijo de espacio de nombres, el nombre local, el identificador URI de espacio de nombres y el valor especificado.

En el siguiente ejemplo, se inserta un elemento pages nuevo antes del elemento secundario price del primer elemento book en el archivo 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)

En el ejemplo se toma como entrada el archivo 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>

Para obtener más información sobre los métodos InsertAfter, InsertBefore, InsertElementAfter y InsertElementBefore, vea la documentación de referencia de la clase XPathNavigator.

Inserción de nodos secundarios

La clase XPathNavigator incluye los siguientes métodos para insertar nodos secundarios.

Estos métodos agregan nodos secundarios al final y al principio de la lista de nodos secundarios del nodo en el que se encuentra situado actualmente un objeto XPathNavigator.

Al igual que los métodos que se indican en la sección "Inserción de nodos relacionados", los métodos AppendChild y PrependChild aceptan un objeto string, XmlReader o un objeto XPathNavigator que contiene el nodo secundario, para agregarlos como parámetros. Ambos métodos también devuelven un objeto XmlWriter que se utiliza para insertar nodos secundarios.

Además, al igual que los métodos que se indican en la sección "Inserción de nodos relacionados", los métodos AppendChildElement y PrependChildElement insertan un solo nodo secundario al final y al principio de la lista de nodos secundarios del nodo en el que se encuentra situado actualmente un objeto XPathNavigator, utilizando como parámetros el prefijo de espacio de nombres, el nombre local, el identificador URI de espacio de nombres y el valor especificado.

En el siguiente ejemplo se agrega un nuevo elemento secundario pages a la lista de elementos secundarios del primer elemento book del archivo 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)

En el ejemplo se toma como entrada el archivo 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>

Para obtener más información sobre los métodos AppendChild, PrependChild, AppendChildElement y PrependChildElement, vea la documentación de referencia de la clase XPathNavigator.

Inserción de nodos de atributos

La clase XPathNavigator incluye los siguientes métodos para insertar nodos de atributos.

Estos métodos insertan nodos de atributos en el nodo de elementos en el que está situado actualmente un objeto XPathNavigator. El método CreateAttribute crea un nodo de atributos en el nodo de elementos en el que está situado actualmente un objeto XPathNavigator, utilizando como parámetros el prefijo de espacio de nombres, el nombre local, el identificador URI de espacio de nombres y el valor especificado. El método CreateAttributes devuelve un objeto XmlWriter que se utiliza para insertar nodos de atributos.

En el siguiente ejemplo se crean nuevos atributos discount y currency en el elemento secundario price del primer elemento book del archivo contosoBooks.xml utilizando el objeto XmlWriter devuelto desde el método 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)

En el ejemplo se toma como entrada el archivo 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>

Para obtener más información sobre los métodos CreateAttribute y CreateAttributes, vea la documentación de referencia de la clase XPathNavigator.

Copia de nodos

En determinados casos, puede que desee llenar un documento XML con el contenido de otro documento XML. Tanto la clase XPathNavigator como la clase XmlWriter pueden copiar nodos en un objeto XmlDocument desde un objeto XmlReader existente o desde un objeto XPathNavigator.

Los métodos AppendChild, PrependChild, InsertBefore y InsertAfter de la clase XPathNavigator tienen sobrecargas que pueden aceptar como parámetro un objeto XPathNavigator o un objeto XmlReader.

El método WriteNode de la clase XmlWriter tiene sobrecargas que pueden aceptar un objeto XmlNode, XmlReader o XPathNavigator.

En el siguiente ejemplo se copian todos los elementos book de un documento a otro.

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

Inserción de valores

La clase XPathNavigator incluye los métodos SetValue y SetTypedValue para insertar valores de un nodo en un objeto XmlDocument.

Inserción de valores sin información de tipos

El método SetValue simplemente inserta el valor string sin información de tipos, que se pasa como parámetro, como valor del nodo en el que se encuentra situado actualmente el objeto XPathNavigator. Este valor se inserta sin ningún tipo o sin comprobar si el nuevo valor es válido de acuerdo con el tipo del nodo si hay disponible información de esquema.

En el siguiente ejemplo, el método SetValue se utiliza para actualizar todos los elementos price del archivo 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)

En el ejemplo se toma como entrada el archivo 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>

Inserción de valores con información de tipos

Cuando un nodo es de un tipo simple de esquema XML del W3C, el valor nuevo que ha insertado el método SetTypedValue se comprueba en las facetas del tipo simple antes de establecer el valor. Si el valor nuevo no es válido de acuerdo con el tipo del nodo (por ejemplo, si se establece un valor de -1 en un elemento cuyo tipo es xs:positiveInteger), se produce una excepción.

En el siguiente ejemplo se intenta cambiar el valor del elemento price del primer elemento book en el archivo contosoBooks.xml por un valor DateTime. Dado que el tipo de esquema XML del elemento price está definido como xs:decimal en los archivos contosoBooks.xsd, se produce una excepción.

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

En el ejemplo se toma como entrada el archivo 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>

En el ejemplo también se toma como entrada el archivo 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>

Propiedades InnerXml y OuterXml

Las propiedades InnerXml y OuterXml de la clase XPathNavigator cambian el marcado XML de los nodos en los que se encuentra situado actualmente un objeto XPathNavigator.

La propiedad InnerXml cambia el marcado XML de los nodos secundarios en los que se encuentra situado actualmente el objeto XPathNavigator por el contenido analizado de la string XML especificada. Igualmente, la propiedad OuterXml cambia el marcado XML de los nodos secundarios en los que se encuentra situado actualmente un objeto XPathNavigator, así como el propio nodo actual.

Además de los métodos que se describen en este tema, se pueden utilizar las propiedades InnerXml y OuterXml para insertar nodos y valores en un documento XML. Para más información sobre el uso de las propiedades InnerXml y OuterXml para insertar nodos y valores, vea el tema Modificación de datos XML con XPathNavigator.

Conflictos de xml:lang y espacios de nombres

Se pueden producir determinados conflictos relacionados con el ámbito del espacio de nombres y las declaraciones xml:lang al insertar datos XML utilizando los métodos InsertBefore, InsertAfter, AppendChild y PrependChild de la clase XPathNavigator que toman objetos XmlReader como parámetros.

A continuación, se indican los posibles conflictos de espacios de nombres.

  • Si hay un espacio de nombres en el ámbito dentro del contexto del objeto XmlReader, en donde el prefijo de la asignación del identificador URI del espacio de nombres no está en el contexto del objeto XPathNavigator, se agrega una nueva declaración de espacio de nombres al nodo que se acaba de insertar.

  • Si el mismo identificador URI de espacio de nombres está en el ámbito dentro del contexto del objeto XmlReader y del objeto XPathNavigator, pero tiene otro prefijo asignado en ambos contextos, se agrega una nueva declaración de espacio de nombres al nodo que se acaba de insertar, con el prefijo y el identificador URI de espacio de nombres tomados del objeto XmlReader.

  • Si el mismo prefijo de espacio de nombres está en el ámbito dentro del contexto del objeto XmlReader y del objeto XPathNavigator, pero tiene otro identificador URI de espacio de nombres asignado en ambos contextos, se agrega una nueva declaración de espacio de nombres al nodo que se acaba de insertar, que vuelve a declarar ese prefijo con el identificador URI de espacio de nombres tomado del objeto XmlReader.

  • Si el prefijo y el identificador URI de espacio de nombres en el contexto del objeto XmlReader y del objeto XPathNavigator son los mismos, no se agrega ninguna declaración de espacio de nombres nueva al nodo que se acaba de insertar.

Nota

La descripción anterior también se aplica a declaraciones de espacios de nombres con la string vacía como prefijo (por ejemplo, la declaración de espacio de nombres predeterminada).

A continuación, se indican los posibles conflictos de xml:lang.

  • Si hay un atributo xml:lang en el ámbito dentro del contexto del objeto XmlReader, pero no en el contexto del objeto XPathNavigator, se agrega al nodo que se acaba de insertar un atributo xml:lang cuyo valor se toma del objeto XmlReader.

  • Si hay un atributo xml:lang en el ámbito dentro del contexto del objeto XmlReader y del objeto XPathNavigator, pero cada uno con un valor diferente, se agrega al nodo que se acaba de insertar un atributo xml:lang cuyo valor se toma del objeto XmlReader.

  • Si hay un atributo en el ámbito xml:lang dentro del contexto del objeto XmlReader y del objetoXPathNavigator y cada uno tiene el mismo valor, no se agrega al nodo que se acaba de insertar ningún atributo xml:lang nuevo.

  • Si hay un atributo xml:lang en el ámbito dentro del contexto del objeto XPathNavigator, pero no existe ninguno en el contexto del objeto XmlReader, no se agrega al nodo que se acaba de insertar ningún atributo xml:lang.

Inserción de nodos con XmlWriter

Los métodos que se utilizan para insertar nodos de atributos, secundarios y relacionados que se describen en la sección "Inserción de nodos y valores" están sobrecargados. Los métodos InsertAfter, InsertBefore, AppendChild, PrependChild y CreateAttributes de la clase XPathNavigator devuelven un objeto XmlWriter que se utiliza para insertar nodos.

Métodos XmlWriter incompatibles

No todos los métodos que se utilizan para escribir información en un documento XML con la clase XmlWriter son compatibles con la clase XPathNavigator. Esto se debe a la diferencia entre el modelo de datos XPath y el Modelo de objetos de documento (DOM).

En la siguiente tabla se describen los métodos de la clase XmlWriter que no son compatibles con la clase XPathNavigator.

Método Descripción
WriteEntityRef Inicia una excepción NotSupportedException.
WriteDocType Se omite en el nivel raíz e inicia una excepción NotSupportedException si se llama desde cualquier otro nivel del documento XML.
WriteCData Se trata como una llamada al método WriteString para el carácter o caracteres equivalentes.
WriteCharEntity Se trata como una llamada al método WriteString para el carácter o caracteres equivalentes.
WriteSurrogateCharEntity Se trata como una llamada al método WriteString para el carácter o caracteres equivalentes.

Para obtener más información sobre la clase XmlWriter, vea la documentación de referencia de la clase XmlWriter.

Varios objetos XmlWriter

Es posible tener varios objetos XPathNavigator apuntando a diferentes partes de un documento XML con uno o varios objetos XmlWriter abiertos. Se permite tener varios objetos XmlWriter en situaciones en las que solo hay un subproceso.

A continuación se indican una serie de puntos importantes que hay que tener en cuenta al utilizar varios objetos XmlWriter.

  • Se agregan fragmentos XML escritos por objetos XmlWriter al documento XML cuando se llama al método Close de cada objeto XmlWriter. Hasta ese punto, el objeto XmlWriter está escribiendo un fragmento desconectado. Si se realiza una operación en el documento XML, cualquier fragmento que estuviera escribiendo un objeto XmlWriter antes de que se haya llamado a Close, no resulta afectado.

  • Si hay un objeto XmlWriter abierto en un subárbol XML en concreto y ese subárbol se elimina, todavía es posible agregar el objeto XmlWriter al subárbol. El subárbol se convierte simplemente en un fragmento eliminado.

  • Si se abren varios objetos XmlWriter en el mismo punto del documento XML, se agregan al documento XML en el orden en el que se cierran los objetos XmlWriter, no en el orden en el que se han abierto.

En el siguiente ejemplo se crea un objeto XmlDocument y un objeto XPathNavigator y, a continuación, se utiliza el objeto XmlWriter que devuelve el método PrependChild para crear la estructura del primer libro en el archivo books.xml. A continuación, se guarda como el archivo book.xml en el ejemplo.

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

Cómo guardar un documento XML

Para guardar los cambios realizados en un objeto XmlDocument como resultado de los métodos que se describen en este tema, se utilizan los métodos de la clase XmlDocument. Para obtener más información sobre cómo guardar los cambios realizados en un objeto XmlDocument, vea Guardar y escribir un documento.

Vea también