Remova os dados XML usando XPathNavigator
A classe de XPathNavigator fornece um conjunto de métodos usados para remover os nós e valores de um documento XML. Para usar esses métodos, o objeto XPathNavigator deve ser editável, ou seja, sua propriedade CanEdit deve ser true
.
Os objetos XPathNavigator que podem editar um documento XML são criados pelo método CreateNavigator da classe XmlDocument. os objetos deXPathNavigator criados pela classe de XPathDocument são somente leitura e qualquer tentativa de usar os métodos de um objeto de XPathNavigator criado por XPathDocument objetos resultados em NotSupportedException.
Para saber mais sobre como criar objetos XPathNavigator editáveis, confira Leitura de dados XML usando XPathDocument e XmlDocument.
Removendo os nós
A classe de XPathNavigator fornece o método de DeleteSelf para remover os nós de um documento XML.
Removendo um nó
A classe de XPathNavigator fornece o método de DeleteSelf para excluir o nó atual que um objeto de XPathNavigator é posicionado atualmente de um documento XML.
Depois que um nó foi excluído usando o método DeleteSelf , não é mais alcançável raiz do objeto de XmlDocument . Depois que um nó foi excluído, XPathNavigator está localizado no nó pai do nó excluído.
Uma operação de exclusão não afeta a posição de nenhum objeto de XPathNavigator posicionado sobre o nó excluído. Esses objetos de XPathNavigator são válidos no sentido que podem mover dentro da sub-árvore excluída, mas não podem ser movidos à árvore do nó usando os métodos definidos de navegação do nó normal da classe de XPathNavigator .
Observação
O método de MoveTo da classe de XPathNavigator pode ser usado para mover esses objetos de XPathNavigator de novo na árvore do nó principal, ou de árvore nó principal da subárvore excluída.
No exemplo a seguir, o elemento de price
do primeiro elemento de book
do arquivo de contosoBooks.xml
é excluído usando o método DeleteSelf . A posição do objeto de XPathNavigator após o elemento de price
é excluída está no elemento pai de 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 arquivo contosoBooks.xml
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>
Removendo um nó de atributo
Os nós de atributo são removidos de um documento XML usando o método DeleteSelf .
Depois que um nó de atributo foi excluído, não é mais alcançável do nó raiz de um objeto de XmlDocument e o objeto de XPathNavigator é posicionado no elemento pai.
Atributos padrão
Independentemente do método usado para remover os atributos, há limitações especiais em remover os atributos que são definidos como atributos padrão no DTD ou no esquema XML para o documento XML. Os atributos padrão não podem ser removidos a menos que o elemento que pertencem a também é removido. Os atributos padrão são sempre atual para elementos que têm atributos padrões declarados, e como resultado, excluindo resultados de um atributo padrão em uma substituição atributo ser inserido no elemento e ser inicializado para o valor padrão que foi declarado.
Removendo os valores
A classe de XPathNavigator fornece os métodos de SetValue e de SetTypedValue para remover sem tipo e os valores tipados de um documento XML.
Removendo os valores sem tipo
O método SetValue simplesmente insere o valor sem tipo de string
passado como um parâmetro como o valor do nó no qual o objeto XPathNavigator está posicionado no momento. Passando uma cadeia de caracteres vazia para o método de SetValue remove o valor do nó atual.
O exemplo a seguir remove o valor do elemento de price
do primeiro elemento de book
no arquivo de 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 arquivo contosoBooks.xml
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>
Removendo os valores tipados
Quando o tipo de um nó é um tipo simples de Esquema XML do W3C, o novo valor inserido pelo método SetTypedValue é verificado em relação às facetas do tipo simples antes que o valor seja definido. Se o novo valor não for válido de acordo com o tipo de nó (por exemplo, definir um valor de -1
em um elemento cujo tipo seja xs:positiveInteger
), isso resultará em uma exceção. O método de SetTypedValue também não pode ser null
passado como um parâmetro. Como resultado remova o valor de um nó tipado deve seguir com o tipo do nó.
O exemplo a seguir remove o valor do elemento de price
do primeiro elemento de book
no arquivo de contosoBooks.xml
usando o método SetTypedValue definindo o valor a 0
. O valor do nó não é removido, mas o custo de 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 objeto de XmlDocument . Tentativas de excluir os nós de namespace usando o método de DeleteSelf resultam em uma exceção.
As propriedades de InnerXml e de OuterXml
As propriedades InnerXml e OuterXml da classe XPathNavigator alteram a marcação XML dos nós nos quais um objeto XPathNavigator está posicionado no momento.
A propriedade InnerXml altera a marcação XML dos nós filho no qual um objeto XPathNavigator está posicionado no momento com o conteúdo analisado da string
do XML determinada. Da mesma maneira, a propriedade OuterXml altera a marcação XML dos nós filho no qual um objeto XPathNavigator está posicionado no momento além do próprio nó atual.
Além dos métodos descritos neste tópico, InnerXml e as propriedades de OuterXml podem ser usados para remover os nós e valores de um documento XML. Para saber mais sobre como usar as propriedades InnerXml e OuterXml para modificar nós, confira o tópico Modificar dados XML usando XPathNavigator.
Salvando um documento XML
Salvando as alterações feitas a um objeto de XmlDocument como resultado dos métodos descritos neste tópico é executado usando os métodos da classe XmlDocument . Para saber mais sobre como salvar as alterações feitas em um objeto XmlDocument, confira Salvar e gravar um documento.