Compartir a través de


Cómo quitar datos XML con XPathNavigator

La clase XPathNavigator incluye un conjunto de métodos que se utilizan para quitar nodos y valores de 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.

Cómo quitar nodos

La clase XPathNavigator incluye el método DeleteSelf para quitar nodos de un documento XML.

Cómo quitar un nodo

La clase XPathNavigator incluye el método DeleteSelf para eliminar el nodo actual en el que se encuentra situado actualmente un objeto XPathNavigator de un documento XML.

Una vez eliminado un nodo con el método DeleteSelf, ya no se puede llegar a él desde la raíz del objeto XmlDocument. Una vez eliminado un nodo, XPathNavigator se sitúa en el nodo primario del nodo eliminado.

La operación de eliminación no afecta a la posición de ningún objeto XPathNavigator situado en el nodo eliminado. Estos objetos XPathNavigator son válidos en el sentido de que se pueden mover en el subárbol eliminado, pero no se pueden mover al árbol del nodo principal utilizando los métodos normales de navegación por conjuntos de nodos de la clase XPathNavigator.

Nota

El método MoveTo de la clase XPathNavigator se puede utilizar para mover estos objetos XPathNavigator de nuevo al árbol del nodo principal, o desde el árbol del nodo principal al subárbol eliminado.

En el siguiente ejemplo se elimina el elemento price del primer elemento book del archivo contosoBooks.xml utilizando el método DeleteSelf. La posición del objeto XPathNavigator después de eliminar el elemento price se encuentra en el elemento book primario.

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.DeleteSelf()  
  
Console.WriteLine("Position after delete: {0}", navigator.Name)  
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.DeleteSelf();  
  
Console.WriteLine("Position after delete: {0}", navigator.Name);  
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>

Cómo quitar un nodo de atributos

Los nodos de atributos se quitan de un documento XML utilizando el método DeleteSelf.

Después de eliminar un nodo de atributos, ya no se puede llegar a él desde el nodo raíz de un objeto XmlDocument y el objeto XPathNavigator se sitúa en el elemento primario.

Atributos predeterminados

Con independencia del método que se utilice para quitar atributos, existen unas limitaciones especiales para quitar atributos que se hayan definido como predeterminados en la DTD o el esquema XML del documento XML. Los atributos predeterminados no se pueden quitar a menos que se quite también el elemento al que pertenecen. Los atributos predeterminados siempre están presentes en los elementos que los tengan declarados y, como resultado, al eliminar un atributo predeterminado, se inserta un atributo de reemplazo en el elemento y se inicializa en el valor predeterminado que se haya declarado.

Cómo quitar valores

La clase XPathNavigator incluye los métodos SetValue y SetTypedValue para quitar valores con y sin información de tipos de un documento XML.

Cómo quitar 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. Al pasar una cadena vacía al método SetValue, se quita el valor del nodo actual.

En el siguiente ejemplo, se quita el valor del elemento price del primer elemento book en el archivo contosoBooks.xml utilizando el método SetValue.

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.SetValue("")  
  
navigator.MoveToRoot()  
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.SetValue("");  
  
navigator.MoveToRoot();  
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>

Cómo quitar 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. El método SetTypedValue tampoco se puede pasar null como parámetro. Como resultado, al quitar el valor de un nodo con tipo, se debe cumplir el tipo de esquema del nodo.

En el siguiente ejemplo, se quita el valor del elemento price del primer elemento book en el archivo contosoBooks.xml con el método SetTypedValue estableciendo el valor en 0. El valor del nodo no se quita, pero sí el precio del libro de acuerdo con su tipo de datos de xs:decimal.

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(0)  
  
navigator.MoveToRoot()  
Console.WriteLine(navigator.OuterXml)  
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(0);  
  
navigator.MoveToRoot();  
Console.WriteLine(navigator.OuterXml);  

Nodos de espacios de nombres

Los nodos de espacios de nombres no se pueden eliminar de un objeto XmlDocument. Si se intenta eliminar nodos de espacios de nombres con el método DeleteSelf, se produce una excepción.

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 quitar nodos y valores de un documento XML. Para más información sobre el uso de las propiedades InnerXml y OuterXml para modificar nodos, vea el tema Modificación de datos XML con XPathNavigator.

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