Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
La XPathNavigator classe fournit un ensemble de méthodes utilisées pour modifier des nœuds et des valeurs dans un document XML. Pour utiliser ces méthodes, l’objet XPathNavigator doit être modifiable, autrement dit, sa CanEdit propriété doit être true.
XPathNavigator les objets qui peuvent modifier un document XML sont créés par la CreateNavigator méthode de la XmlDocument classe. XPathNavigator les objets créés par la XPathDocument classe sont en lecture seule et toute tentative d’utilisation des méthodes d’édition d’un XPathNavigator objet créé par un XPathDocument objet entraîne un NotSupportedException.
Pour plus d’informations sur la création d’objets modifiables XPathNavigator , consultez Lecture de données XML à l’aide de XPathDocument et xmlDocument.
Modification de nœuds
Une technique simple pour modifier la valeur d’un nœud consiste à utiliser les méthodes SetValue et SetTypedValue de la classe XPathNavigator.
Le tableau suivant répertorie les effets de ces méthodes sur différents types de nœuds.
| XPathNodeType | Données modifiées |
|---|---|
| Root | Non pris en charge. |
| Element | Contenu de l’élément. |
| Attribute | Valeur de l’attribut. |
| Text | Contenu du texte. |
| ProcessingInstruction | Le contenu, sauf la cible. |
| Comment | Contenu du commentaire. |
| Namespace | Non pris en charge. |
La XPathNavigator classe fournit également un ensemble de méthodes utilisées pour insérer et supprimer des nœuds. Pour plus d’informations sur l’insertion et la suppression de nœuds d’un document XML, consultez les rubriques Insérer des données XML à l’aide de XPathNavigator et supprimer des données XML à l’aide de rubriques XPathNavigator .
Modification des valeurs non typées
La SetValue méthode insère simplement la valeur non typée string passée en tant que paramètre comme valeur du nœud sur lequel l’objet XPathNavigator est actuellement positionné. La valeur est insérée sans type ou sans vérifier que la nouvelle valeur est valide en fonction du type du nœud si des informations de schéma sont disponibles.
Dans l’exemple suivant, la SetValue méthode est utilisée pour mettre à jour tous les price éléments du contosoBooks.xml fichier.
XmlDocument document = new XmlDocument();
document.Load("contosoBooks.xml");
XPathNavigator navigator = document.CreateNavigator();
XmlNamespaceManager manager = new XmlNamespaceManager(navigator.NameTable);
manager.AddNamespace("bk", "http://www.contoso.com/books");
foreach (XPathNavigator nav in navigator.Select("//bk:price", manager))
{
if (nav.Value == "11.99")
{
nav.SetValue("12.99");
}
}
Console.WriteLine(navigator.OuterXml);
Dim document As XmlDocument = New XmlDocument()
document.Load("contosoBooks.xml")
Dim navigator As XPathNavigator = document.CreateNavigator()
Dim manager As XmlNamespaceManager = New XmlNamespaceManager(navigator.NameTable)
manager.AddNamespace("bk", "http://www.contoso.com/books")
For Each nav As XPathNavigator In navigator.Select("//bk:price", manager)
If nav.Value = "11.99" Then
nav.SetValue("12.99")
End If
Next
Console.WriteLine(navigator.OuterXml)
L’exemple prend le contosoBooks.xml fichier en tant qu’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>
Modification des valeurs typées
Lorsque le type d’un nœud est un type simple de schéma XML W3C, la nouvelle valeur insérée par la SetTypedValue méthode est vérifiée par rapport aux facettes du type simple avant la définition de la valeur. Si la nouvelle valeur n’est pas valide en fonction du type du nœud (par exemple, la définition d’une valeur -1 sur un élément dont le type est xs:positiveInteger), elle génère une exception.
L'exemple suivant tente de modifier la valeur de l’élément price du premier élément book dans le fichier contosoBooks.xml en une valeur DateTime. Étant donné que le type de schéma XML de l’élément price est défini comme xs:decimal dans les contosoBooks.xsd fichiers, cela entraîne une exception.
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(DateTime.Now)
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(DateTime.Now);
L’exemple prend le contosoBooks.xml fichier en tant qu’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>
L’exemple considère également contosoBooks.xsd comme entrée.
<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.contoso.com/books" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="bookstore">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="book">
<xs:complexType>
<xs:sequence>
<xs:element name="title" type="xs:string" />
<xs:element name="author">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="name" type="xs:string" />
<xs:element minOccurs="0" name="first-name" type="xs:string" />
<xs:element minOccurs="0" name="last-name" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="price" type="xs:decimal" />
</xs:sequence>
<xs:attribute name="genre" type="xs:string" use="required" />
<xs:attribute name="publicationdate" type="xs:date" use="required" />
<xs:attribute name="ISBN" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Effets de la modification de données XML fortement typées
La XPathNavigator classe utilise le schéma XML W3C comme base pour décrire le xml fortement typé. Les éléments et attributs peuvent être annotés avec des informations de type basées sur la validation sur un document de schéma XML W3C. Les éléments qui peuvent contenir d’autres éléments ou attributs sont appelés types complexes, tandis que ceux qui ne peuvent contenir que du contenu textuel sont appelés types simples.
Remarque
Les attributs ne peuvent avoir que des types simples.
Un élément ou un attribut peut être considéré comme valide par le schéma s’il est conforme à toutes les règles spécifiques à sa définition de type. Un élément qui a le type xs:int simple doit contenir une valeur numérique entre -2147483648 et 2147483647 pour être valide selon le schéma. Pour les types complexes, la validité du schéma de l’élément dépend de la validité du schéma de ses éléments et attributs enfants. Ainsi, si un élément est valide par rapport à sa définition de type complexe, tous ses éléments enfants et attributs sont valides par rapport à leurs définitions de type. De même, si même l’un des éléments ou attributs enfants d’un élément n’est pas valide par rapport à sa définition de type ou a une validité inconnue, l’élément est également non valide ou de validité inconnue.
Étant donné que la validité d’un élément dépend de la validité de ses éléments et attributs enfants, les modifications apportées à l’un ou l’autre entraînent la modification de la validité de l’élément s’il était précédemment valide. Plus précisément, si les éléments ou attributs enfants d’un élément sont insérés, mis à jour ou supprimés, la validité de l’élément devient inconnue. Cela est représenté par la propriété Validity de la propriété SchemaInfo de l'élément, définie sur NotKnown. De plus, cet effet se répète de façon récursive dans le document XML, car la validité de l’élément parent de l’élément (et de son élément parent, et ainsi de suite) devient également inconnue.
Pour plus d’informations sur la validation de schéma et la classe XPathNavigator, consultez Validation de schéma à l’aide de XPathNavigator.
Modification des attributs
Les méthodes SetValue et SetTypedValue peuvent être utilisées pour modifier les nœuds d'attributs non typés et typés, ainsi que les autres types de nœuds répertoriés dans la section « Modification des nœuds ».
L’exemple suivant modifie la valeur de l’attribut genre du premier book élément du books.xml fichier.
Dim document As XmlDocument = New XmlDocument()
document.Load("books.xml")
Dim navigator As XPathNavigator = document.CreateNavigator()
navigator.MoveToChild("bookstore", String.Empty)
navigator.MoveToChild("book", String.Empty)
navigator.MoveToAttribute("genre", String.Empty)
navigator.SetValue("non-fiction")
navigator.MoveToRoot()
Console.WriteLine(navigator.OuterXml)
XmlDocument document = new XmlDocument();
document.Load("books.xml");
XPathNavigator navigator = document.CreateNavigator();
navigator.MoveToChild("bookstore", String.Empty);
navigator.MoveToChild("book", String.Empty);
navigator.MoveToAttribute("genre", String.Empty);
navigator.SetValue("non-fiction");
navigator.MoveToRoot();
Console.WriteLine(navigator.OuterXml);
Pour plus d’informations sur les méthodes SetValue et SetTypedValue, consultez les sections « Modification des valeurs non typées » et « Modification des valeurs typées ».
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, avec le contenu extrait du XML XPathNavigator donné, le balisage XML des nœuds enfants sur lesquels se trouve actuellement un objet string. De même, la OuterXml propriété modifie le balisage XML des nœuds enfants sur lesquels un XPathNavigator objet est actuellement positionné ainsi que le nœud actuel lui-même.
L’exemple suivant utilise la OuterXml propriété pour modifier la valeur de l’élément price et insérer un nouvel discount attribut sur le premier book élément du contosoBooks.xml fichier.
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.OuterXml = "<price discount=\"0\">10.99</price>"
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.OuterXml = "<price discount=\"0\">10.99</price>";
navigator.MoveToRoot();
Console.WriteLine(navigator.OuterXml);
L’exemple prend le contosoBooks.xml fichier en tant qu’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>
Modification des nœuds d’espace de noms
Dans le dom (Document Object Model), les déclarations d’espace de noms sont traitées comme s’il s’agit d’attributs réguliers qui peuvent être insérés, mis à jour et supprimés. La XPathNavigator classe n’autorise pas ces opérations sur les nœuds d’espace de noms, car la modification de la valeur d’un nœud d’espace de noms peut modifier l’identité des éléments et des attributs dans l’étendue du nœud d’espace de noms, comme illustré dans l’exemple suivant.
<root xmlns="http://www.contoso.com">
<child />
</root>
Si l’exemple XML ci-dessus est modifié de la manière suivante, cela renomme efficacement chaque élément du document, car la valeur de l’URI d’espace de noms de chaque élément est modifiée.
<root xmlns="urn:contoso.com">
<child />
</root>
L’insertion de nœuds d’espace de noms qui ne sont pas en conflit avec les déclarations d’espace de noms à l’étendue dans laquelle ils sont insérés est autorisée par la classe XPathNavigator. Dans ce cas, les déclarations d’espace de noms ne sont pas déclarées à des étendues inférieures dans le document XML et n’entraînent pas de changement de nom, comme illustré dans l’exemple suivant.
<root xmlns:a="http://www.contoso.com">
<parent>
<a:child />
</parent>
</root>
Si l’exemple XML ci-dessus est modifié de la façon suivante, les déclarations d’espace de noms sont correctement propagées dans le document XML sous l’étendue de l’autre déclaration d’espace de noms.
<root xmlns:a="http://www.contoso.com">
<parent a:parent-id="1234" xmlns:a="http://www.contoso.com/parent-id">
<a:child xmlns:a="http://www.contoso.com/" />
</parent>
</root>
Dans l’exemple XML ci-dessus, l’attribut a:parent-id est inséré sur l’élément parent dans l’espace de noms http://www.contoso.com/parent-id. La CreateAttribute méthode est utilisée pour insérer l’attribut lorsqu’il est positionné sur l’élément parent . La http://www.contoso.com déclaration d’espace de noms est automatiquement insérée par la XPathNavigator classe pour préserver la cohérence du reste du document XML.
Modification des nœuds de référence d’entité
Les nœuds de référence d'entité dans un objet XmlDocument sont en lecture seule et ne peuvent pas être modifiés à l'aide des classes XPathNavigator ou XmlNode. Toute tentative de modification d’un nœud de référence d’entité entraîne un InvalidOperationException.
Modification de nœuds xsi :nil
La recommandation de schéma XML W3C introduit le concept d’un élément pouvant être nillable. Lorsqu’un élément est nillable, il est possible que l’élément n’ait pas de contenu et qu’il soit toujours valide. Le concept d'un élément pouvant être nul est similaire à celui d'un objet null. La principale différence est qu’un null objet ne peut pas être accessible de quelque manière que ce soit, alors qu’un xsi:nil élément a toujours des propriétés telles que des attributs accessibles, mais n’a pas de contenu (éléments enfants ou texte). L'existence de l'attribut xsi:nil, avec une valeur de true, sur un élément d'un document XML est utilisée pour indiquer qu'un élément n'a pas de contenu.
Si un objet XPathNavigator est utilisé pour ajouter du contenu à un élément valide avec un attribut xsi:nil ayant une valeur de true, la valeur de son attribut xsi:nil est définie sur false.
Remarque
Si le contenu d’un élément avec un xsi:nil attribut défini false sur est supprimé, la valeur de l’attribut n’est pas modifiée en true.
Enregistrement d’un document XML
L’enregistrement des modifications apportées à un XmlDocument objet en raison des méthodes d’édition décrites dans cette rubrique est effectuée à l’aide des méthodes de la XmlDocument classe. Pour plus d’informations sur l’enregistrement des modifications apportées à un XmlDocument objet, consultez Enregistrement et écriture d’un document.