Compartir a través de


Eliminación de datos XML mediante XPathNavigator

La XPathNavigator clase proporciona un conjunto de métodos usados para quitar nodos y valores de un documento XML. Para poder usar estos métodos, el XPathNavigator objeto debe ser editable, es decir, su CanEdit propiedad debe ser true.

XPathNavigator Los objetos que pueden editar un documento XML se crean mediante el CreateNavigator método de la XmlDocument clase . XPathNavigator los objetos creados por la XPathDocument clase son de solo lectura y cualquier intento de usar los métodos de edición de un XPathNavigator objeto creado por un XPathDocument objeto da como resultado un NotSupportedException.

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

Quitar nodos

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

Eliminación de un nodo

La XPathNavigator clase proporciona el DeleteSelf método para eliminar el nodo actual en el que está colocado un XPathNavigator objeto desde un documento XML.

Después de eliminar un nodo mediante el DeleteSelf método , ya no es accesible desde la raíz del XmlDocument objeto. Una vez eliminado un nodo, XPathNavigator se coloca en el nodo primario del nodo eliminado.

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

Nota:

El MoveTo método de la XPathNavigator clase se puede usar para volver a mover estos XPathNavigator objetos al árbol de nodos principal o desde el árbol de nodos principal al subárbol eliminado.

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

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 el contosoBooks.xml archivo 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>

Quitar un nodo de atributo

Los nodos de atributo se quitan de un documento XML mediante el DeleteSelf método .

Una vez eliminado un nodo de atributo, ya no es accesible desde el nodo raíz de un XmlDocument objeto y el XPathNavigator objeto se coloca en el elemento primario.

Atributos predeterminados

Independientemente del método usado para quitar atributos, existen limitaciones especiales en la eliminación de atributos definidos como atributos predeterminados en el esquema DTD o XML para el documento XML. Los atributos predeterminados no se pueden quitar a menos que también se quite el elemento al que pertenecen. Los atributos predeterminados siempre están presentes para los elementos que tienen atributos predeterminados declarados y, como resultado, la eliminación de un atributo predeterminado da lugar a que se inserte un atributo de reemplazo en el elemento y se inicialice en el valor predeterminado declarado.

Eliminar valores

La clase XPathNavigator proporciona los métodos SetValue y SetTypedValue para quitar valores sin tipo y tipados de un documento XML.

Cómo quitar valores sin información de tipos

El método SetValue simplemente inserta el valor string sin tipo pasado como parámetro como el valor del nodo donde el objeto XPathNavigator está actualmente ubicado. Pasar una cadena vacía al SetValue método 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 el contosoBooks.xml archivo 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>

Cómo quitar valores con información de tipos

Cuando el tipo de un nodo es un tipo simple de esquema XML W3C, el nuevo valor insertado por el SetTypedValue método se comprueba con las facetas del tipo simple antes de establecer el valor. Si el nuevo valor no es válido según 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. Tampoco se puede pasar SetTypedValue como parámetro al método null. Como resultado, eliminar el valor de un nodo tipado debe cumplir con el tipo de esquema del nodo.

En el ejemplo siguiente se quita el valor del elemento price del primer elemento book en el archivo contosoBooks.xml mediante 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. Los intentos de eliminar nodos de espacio de nombres utilizando el método DeleteSelf producen 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 un objeto XPathNavigator está posicionado actualmente.

La InnerXml propiedad cambia el marcado XML de los nodos secundarios en los que está colocado un XPathNavigator objeto con el contenido analizado del XML stringespecificado. De forma similar, la OuterXml propiedad cambia el marcado XML de los nodos secundarios en los que se coloca un XPathNavigator objeto, así como en el propio nodo actual.

Además de los métodos descritos en este tema, las InnerXml propiedades y OuterXml se pueden usar para quitar nodos y valores de un documento XML. Para obtener más información sobre el uso de las InnerXml propiedades y OuterXml para modificar nodos, consulte el tema Modificar datos XML mediante XPathNavigator .

Guardar un documento XML

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

Consulte también