Partilhar via


Remover dados XML usando XPathNavigator

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

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

Para obter mais informações sobre como criar objetos editáveis XPathNavigator , consulte Lendo dados XML usando XPathDocument e XmlDocument.

Removendo nós

A XPathNavigator classe fornece o DeleteSelf método para remover nós de um documento XML.

Removendo um nó

A XPathNavigator classe fornece o método DeleteSelf para eliminar o nó atual em que um objeto XPathNavigator está atualmente posicionado num documento XML.

Depois que um nó foi excluído usando o DeleteSelf método, ele não pode mais ser acessado a partir da raiz do XmlDocument objeto. Depois que um nó for excluído, o XPathNavigator será posicionado no nó pai do nó excluído.

Uma operação de exclusão não afeta a posição de nenhum XPathNavigator objeto posicionado no nó excluído. Esses XPathNavigator objetos são válidos no sentido de que podem se mover dentro da subárvore excluída, mas não podem ser movidos para a árvore de nó principal usando os métodos de navegação do conjunto de nós regulares da classe XPathNavigator.

Observação

O MoveTo método da XPathNavigator classe pode ser usado para mover esses XPathNavigator objetos de volta para a árvore do nó principal ou da árvore do nó principal para a subárvore excluída.

No exemplo a seguir, o elemento price do primeiro elemento book do ficheiro contosoBooks.xml é eliminado usando o método DeleteSelf. A posição do XPathNavigator objeto depois que o price elemento é excluído está no elemento pai 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);  

O exemplo usa o contosoBooks.xml arquivo como uma 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>

Removendo um nó de atributo

Os nós de atributo são removidos de um documento XML usando o DeleteSelf método.

Depois de um nó de atributo ser excluído, ele não é mais acessível a partir do nó raiz do objeto XmlDocument e o objeto XPathNavigator está localizado no elemento pai.

Atributos padrão

Independentemente do método usado para remover atributos, há limitações especiais na remoção de atributos que são definidos como atributos padrão no DTD ou esquema XML para o documento XML. Os atributos padrão não podem ser removidos, a menos que o elemento ao qual pertencem também seja removido. Os atributos padrão estão sempre presentes para elementos que têm atributos padrão declarados e, como resultado, excluir um atributo padrão resulta em um atributo de substituição sendo inserido no elemento e inicializado com o valor padrão que foi declarado.

Removendo valores

A XPathNavigator classe fornece os métodos SetValue e SetTypedValue para remover valores não tipados e tipados de um documento XML.

Removendo valores não tipados

O método SetValue simplesmente insere o valor não tipado string, passado como parâmetro, como o valor do nó onde o objeto XPathNavigator está atualmente posicionado. Passar uma cadeia de caracteres vazia para o SetValue método remove o valor do nó atual.

O exemplo a seguir remove o valor do elemento price do primeiro elemento book no ficheiro contosoBooks.xml usando o 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);  

O exemplo usa o contosoBooks.xml arquivo como uma 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>

Removendo valores digitados

Quando o tipo de um nó é um tipo simples de esquema XML W3C, o novo valor inserido pelo método SetTypedValue é verificado em relação às facetas do tipo simples antes que o valor seja atribuído. Se o novo valor não for válido de acordo com o tipo do nó (por exemplo, definindo um valor de -1 em um elemento cujo tipo é xs:positiveInteger), isso resultará em uma exceção. O SetTypedValue método também não pode ser passado null como um parâmetro. Como resultado, a remoção do valor de um nó digitado deve estar em conformidade com o tipo de esquema do nó.

O exemplo a seguir remove o valor do elemento price do primeiro elemento book no arquivo contosoBooks.xml usando o método SetTypedValue, definindo o valor como 0. O valor do nó não é removido, mas o preço do livro foi removido de acordo com seu tipo de dados 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);  

Nós de namespace

Os nós de namespace não podem ser excluídos de um XmlDocument objeto. Tentativas de excluir nós de namespace usando o DeleteSelf método resulta em uma exceção.

As propriedades InnerXml e OuterXml

As propriedades InnerXml e OuterXml da classe XPathNavigator alteram a marcação XML dos nós em que um objeto XPathNavigator está atualmente posicionado.

A propriedade InnerXml altera a marcação XML dos nós filho em que um objeto XPathNavigator está atualmente posicionado, utilizando o conteúdo analisado do XML string fornecido. Da mesma forma, a OuterXml propriedade altera a marcação XML dos nós filho onde um objeto XPathNavigator está atualmente posicionado, assim como o próprio nó em questão.

Além dos métodos descritos neste tópico, as InnerXml propriedades e OuterXml podem ser usadas para remover nós e valores de um documento XML. Para obter mais informações sobre como usar as InnerXml propriedades e OuterXml para modificar nós, consulte o tópico Modificar dados XML usando XPathNavigator .

Guardar um documento XML

Salvar alterações feitas em um XmlDocument objeto como resultado dos métodos descritos neste tópico é executado usando os XmlDocument métodos da classe. Para obter mais informações sobre como salvar alterações feitas em um XmlDocument objeto, consulte Salvando e gravando um documento.

Ver também