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 NotSupportedExceptionarquivo .

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 DeleteSelf método para excluir o nó atual em que um XPathNavigator objeto está posicionado atualmente de um 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 eles 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 XPathNavigator classe.

Nota

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 price elemento do primeiro book elemento do arquivo é excluído contosoBooks.xml usando o DeleteSelf método. 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 que um nó de atributo é excluído, ele não pode mais ser acessado a partir do nó raiz de um XmlDocument objeto e o XPathNavigator objeto é posicionado 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 SetValue métodos e SetTypedValue para remover valores não tipados e digitados de um documento XML.

Removendo valores não tipados

O SetValue método simplesmente insere o valor não tipado string passado como um parâmetro como o valor do nó no qual o XPathNavigator objeto está posicionado no momento. 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 price elemento do primeiro book elemento no contosoBooks.xml arquivo usando o SetValue método.

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 é verificado em relação às SetTypedValue facetas do tipo simples antes que o valor seja definido. 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 do price primeiro elemento no arquivo usando o contosoBooks.xmlSetTypedValue método definindo o valor como 0book . 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 InnerXml propriedades e OuterXml da classe alteram XPathNavigator a marcação XML dos nós nos quais um XPathNavigator objeto está posicionado no momento.

A InnerXml propriedade altera a marcação XML dos nós filho em que um XPathNavigator objeto está posicionado atualmente com o conteúdo analisado do XML stringfornecido. Da mesma forma, a OuterXml propriedade altera a marcação XML dos nós filho nos quais um XPathNavigator objeto está posicionado no momento, bem como o próprio nó atual.

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.

Consulte também