Partager via


Suppression de données XML à l'aide de XPathNavigator

La classe XPathNavigator fournit un ensemble de méthodes permettant de supprimer des nœuds et des valeurs d'un document XML. Pour pouvoir utiliser ces méthodes, vous devez pouvoir modifier l'objet XPathNavigator, ce qui signifie que sa propriété CanEdit doit être true.

Les objets XPathNavigator qui permettent d'éditer un document XML sont créés par la méthode CreateNavigator de la classe XmlDocument. Les objets XPathNavigator créés par la classe XPathDocument sont en lecture seule et toute tentative d'utilisation des méthodes de modification d'un objet XPathNavigator créé par un objet XPathDocument se traduit par un objet NotSupportedException.

Pour plus d’informations sur la création d’objets XPathNavigator modifiables, consultez Lecture de données XML à l’aide de XPathDocument et XmlDocument.

Suppression de nœuds

La classe XPathNavigator fournit la méthode DeleteSelf permettant de supprimer des nœuds d'un document XML.

Suppression d'un nœud

La classe XPathNavigator fournit la méthode DeleteSelf permettant de supprimer d'un document XML le nœud actuel sur lequel l'objet XPathNavigator est positionné.

Une fois qu'un nœud a été supprimé à l'aide de la méthode DeleteSelf, il n'est plus accessible depuis la racine de l'objet XmlDocument. Après la suppression d'un nœud, l'objet XPathNavigator est positionné sur le nœud parent du nœud supprimé.

Une suppression n'affecte en rien la position des objets XPathNavigator positionnés sur le nœud supprimé. Ces objets XPathNavigator sont valides dans le sens où ils peuvent se déplacer dans la sous-arborescence supprimée, mais ils ne peuvent pas être déplacés vers le nœud principal avec les méthodes ordinaires de navigation dans les collections de nœuds de la classe XPathNavigator.

Notes

La méthode MoveTo de la classe XPathNavigator peut être utilisée pour redéplacer ces objets XPathNavigator vers l’arborescence de nœuds principale ou depuis l’arborescence de nœuds principale vers la sous-arborescence supprimée.

Dans l'exemple suivant, l'élément price du premier élément book du fichier contosoBooks.xml est supprimé à l'aide de la méthode DeleteSelf. Après la suppression de l'élément XPathNavigator, l'objet price est positionné sur l'élément book parent.

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);  

L'exemple prend le fichier contosoBooks.xml comme entrée.

<?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>

Suppression d'un nœud d'attribut

Les nœuds d'attribut d'un document XML se suppriment à l'aide de la méthode DeleteSelf.

Une fois qu'un nœud d'attribut a été supprimé, il n'est plus accessible depuis le nœud racine d'un objet XmlDocument et l'objet XPathNavigator est positionné sur l'élément parent.

Attributs par défaut

Quelle que soit la méthode utilisée pour la suppression des attributs, la suppression d'attributs définis comme des attributs par défaut dans la DTD ou dans le schéma XML du document XML est sujette à des restrictions spéciales. Les attributs par défaut ne peuvent pas être supprimés, à moins que l'élément auquel ils appartiennent ne le soit également. Il y a toujours des attributs par défaut pour les éléments pour lesquels des attributs par défaut ont été déclarés ; par conséquent, la suppression d'un attribut par défaut entraîne l'insertion, dans l'élément, d'un attribut de remplacement qui est initialisé à la valeur par défaut déclarée.

Suppression de valeurs

La classe XPathNavigator fournit les méthodes SetValue et SetTypedValue permettant de supprimer des valeurs typées et non typées d'un document XML.

Suppression de valeurs non typées

La méthode SetValue insère simplement la valeur string non typée transmise sous la forme d'un paramètre comme la valeur du nœud sur lequel l'objet XPathNavigator est actuellement positionné. La transmission d'une chaîne vide à la méthode SetValue supprime la valeur du nœud actuel.

L'exemple suivant supprime la valeur de l'élément price du premier élément book du fichier contosoBooks.xml à l'aide de la méthode 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);  

L'exemple prend le fichier contosoBooks.xml comme entrée.

<?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>

Suppression de valeurs typées

Si le type d'un nœud est un type simple des schémas XML du W3C, la nouvelle valeur insérée par la méthode SetTypedValue est vérifiée par rapport aux facettes du type simple avant d'être définie. Si la nouvelle valeur n'est pas valide par rapport au type du nœud (par exemple, une valeur est définie sur -1 pour un élément dont le type est xs:positiveInteger), une exception se produit. De même, la méthode SetTypedValue ne peut pas recevoir la valeur null comme paramètre. Par conséquent, la suppression de la valeur d'un nœud typé doit être conforme au type de schéma du nœud.

L'exemple suivant supprime la valeur de l'élément price du premier élément book du fichier contosoBooks.xml à l'aide de la méthode SetTypedValue en définissant la valeur sur 0. La valeur du nœud n'est pas supprimée, mais le prix du livre a été supprimé d'après son type de données (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œuds d'espace de noms

Il est impossible de supprimer des nœuds d'espace de noms d'un objet XmlDocument. Toute tentative de suppression des nœuds d'espace de noms avec la méthode DeleteSelf produit une exception.

Propriétés InnerXml et OuterXml

Les propriétés InnerXml et OuterXml de la classe XPathNavigator modifient le balisage XML des nœuds sur lesquels un objet XPathNavigator est actuellement positionné.

La propriété InnerXml modifie le balisage XML des nœuds enfants sur lesquels un objet XPathNavigator est actuellement positionné avec le contenu analysé de la string XML donnée. De même, la propriété OuterXml modifie le balisage XML des nœuds enfants sur lesquels un objet XPathNavigator est actuellement positionné, ainsi que le nœud actuel proprement dit.

Outre les méthodes décrites dans cette rubrique, les propriétés InnerXml et OuterXml permettent de supprimer des nœuds et des valeurs d'un document XML. Pour plus d'informations sur l'utilisation des propriétés InnerXml et OuterXml pour modifier des nœuds, consultez la rubrique Modification de données XML à l’aide de XPathNavigator.

Enregistrement d'un document XML

L'enregistrement des modifications apportées à un objet XmlDocument suite aux méthodes décrites dans cette rubrique s'effectue à l'aide des méthodes de la classe XmlDocument. Pour plus d'informations sur l'enregistrement des modifications apportées à un objet XmlDocument, consultez Enregistrement et écriture d'un document.

Voir aussi