Insertion de données XML à l’aide de XPathNavigator
La classe XPathNavigator fournit un ensemble de méthodes permettant d'insérer des nœuds frères, enfants et d'attribut dans 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.
Insertion de nœuds
La classe XPathNavigator fournit des méthodes permettant d'insérer des nœuds frères, enfants et d'attribut dans un document XML. Ces méthodes permettent d'insérer des nœuds et des attributs à différents emplacements par rapport à la position actuelle d'un objet XPathNavigator et sont décrites dans les sections suivantes.
Insertion de nœuds frères
La classe XPathNavigator fournit les méthodes suivantes pour l'insertion de nœuds frères.
Ces méthodes insèrent des nœuds frères avant et après le nœud sur lequel un objet XPathNavigator est actuellement positionné.
Les méthodes InsertAfter et InsertBefore sont surchargées et acceptent un objet string
, XmlReader ou XPathNavigator contenant le nœud frère à ajouter comme paramètre. Ces deux méthodes retournent également un objet XmlWriter permettant d'insérer des nœuds frères.
Les méthodes InsertElementAfter et InsertElementBefore insèrent un nœud frère unique avant et après le nœud sur lequel un objet XPathNavigator est actuellement positionné à l'aide du préfixe d'espace de noms, du nom local, de l'URI d'espace de noms et de la valeur spécifiés comme paramètres.
Dans l'exemple suivant, un nouvel élément pages
est inséré avant l'élément price
enfant du premier élément book
du fichier contosoBooks.xml
.
XmlDocument^ document = gcnew 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->InsertBefore("<pages>100</pages>");
navigator->MoveToParent();
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.InsertBefore("<pages>100</pages>");
navigator.MoveToParent();
Console.WriteLine(navigator.OuterXml);
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.InsertBefore("<pages>100</pages>")
navigator.MoveToParent()
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>
Pour plus d'informations sur les méthodes InsertAfter, InsertBefore, InsertElementAfter et InsertElementBefore, voir la documentation de référence sur la classe XPathNavigator.
Insertion de nœuds enfants
La classe XPathNavigator fournit les méthodes suivantes pour l'insertion de nœuds enfants.
Ces méthodes ajoutent des nœuds enfants à la fin et au début de la liste de nœuds enfants du nœud sur lequel un objet XPathNavigator est actuellement positionné.
À l'instar des méthodes décrites dans la section sur l'insertion de nœuds frères, les méthodes AppendChild et PrependChild acceptent un objet string
, XmlReader ou XPathNavigator contenant le nœud enfant à ajouter comme paramètre. Ces deux méthodes retournent également un objet XmlWriter permettant d'insérer des nœuds enfants.
À l'instar également des méthodes décrites dans la section sur l'insertion de nœuds frères, les méthodes AppendChildElement et PrependChildElement insèrent un nœud enfant unique à la fin et au début de la liste de nœuds enfants du nœud sur lequel un objet XPathNavigator est actuellement positionné à l'aide du préfixe d'espace de noms, du nom local, de l'URI d'espace de noms et de la valeur spécifiés comme paramètres.
Dans l'exemple suivant, un nouvel élément pages
enfant est ajouté à la liste d'éléments enfants du premier élément book
du fichier contosoBooks.xml
.
XmlDocument^ document = gcnew 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->AppendChild("<pages>100</pages>");
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.AppendChild("<pages>100</pages>");
Console.WriteLine(navigator.OuterXml);
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.AppendChild("<pages>100</pages>")
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>
Pour plus d'informations sur les méthodes AppendChild, PrependChild, AppendChildElement et PrependChildElement, voir la documentation de référence sur la classe XPathNavigator.
Insertion de nœuds d'attribut
La classe XPathNavigator fournit les méthodes suivantes pour l'insertion de nœuds d'attribut.
Ces méthodes insèrent des nœuds d'attribut sur le nœud sur lequel un objet XPathNavigator est actuellement positionné. La méthode CreateAttribute crée un nœud d'attribut sur le nœud d'élément sur lequel un objet XPathNavigator est actuellement positionné à l'aide du préfixe d'espace de noms, du nom local, de l'URI d'espace de noms et de la valeur spécifiés comme paramètres. La méthode CreateAttributes retourne un objet XmlWriter permettant d'insérer des nœuds d'attribut.
Dans l'exemple suivant, de nouveaux attributs discount
et currency
sont créés sur l'élément price
enfant du premier élément book
du fichier contosoBooks.xml
à l'aide de l'objet XmlWriter retourné par la méthode CreateAttributes.
XmlDocument^ document = gcnew 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");
XmlWriter^ attributes = navigator->CreateAttributes();
attributes->WriteAttributeString("discount", "1.00");
attributes->WriteAttributeString("currency", "USD");
attributes->Close();
navigator->MoveToParent();
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");
XmlWriter attributes = navigator.CreateAttributes();
attributes.WriteAttributeString("discount", "1.00");
attributes.WriteAttributeString("currency", "USD");
attributes.Close();
navigator.MoveToParent();
Console.WriteLine(navigator.OuterXml);
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")
Dim attributes As XmlWriter = navigator.CreateAttributes()
attributes.WriteAttributeString("discount", "1.00")
attributes.WriteAttributeString("currency", "USD")
attributes.Close()
navigator.MoveToParent()
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>
Pour plus d'informations sur les méthodes CreateAttribute et CreateAttributes, voir la documentation de référence sur la classe XPathNavigator.
Copie de nœuds
Dans certains cas, il se peut que vous souhaitiez remplir un document XML avec le contenu d'un autre document XML. Les classes XPathNavigator et XmlWriter peuvent copier des nœuds dans un objet XmlDocument à partir d'un objet XmlReader ou XPathNavigator existant.
Les méthodes AppendChild, PrependChild, InsertBefore et InsertAfter de la classe XPathNavigator présentent des surcharges qui peuvent accepter un objet XPathNavigator ou XmlReader comme paramètre.
La méthode WriteNode de la classe XmlWriter présente des surcharges qui peuvent accepter un objet XmlNode, XmlReader ou XPathNavigator.
L'exemple suivant copie tous les éléments book
d'un document dans un autre.
Dim document As XmlDocument = New XmlDocument()
document.Load("books.xml")
Dim navigator As XPathNavigator = document.CreateNavigator()
navigator.MoveToChild("bookstore", String.Empty)
Dim newBooks As XPathDocument = New XPathDocument("newBooks.xml")
Dim newBooksNavigator As XPathNavigator = newBooks.CreateNavigator()
Dim nav As XPathNavigator
For Each nav in newBooksNavigator.SelectDescendants("book", "", false)
navigator.AppendChild(nav)
Next
document.Save("newBooks.xml");
XmlDocument document = new XmlDocument();
document.Load("books.xml");
XPathNavigator navigator = document.CreateNavigator();
navigator.MoveToChild("bookstore", String.Empty);
XPathDocument newBooks = new XPathDocument("newBooks.xml");
XPathNavigator newBooksNavigator = newBooks.CreateNavigator();
foreach (XPathNavigator nav in newBooksNavigator.SelectDescendants("book", "", false))
{
navigator.AppendChild(nav);
}
document.Save("newBooks.xml");
Insertion de valeurs
La classe XPathNavigator fournit les méthodes SetValue et SetTypedValue afin d'insérer des valeurs pour un nœud dans un objet XmlDocument.
Insertion 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 valeur est insérée sans type ou sans vérifier que la nouvelle valeur est valide par rapport au type de nœud si les informations sur le schéma sont disponibles.
Dans l'exemple suivant, la méthode SetValue permet de mettre à jour tous les éléments price
du fichier contosoBooks.xml
.
XmlDocument^ document = gcnew XmlDocument();
document->Load("contosoBooks.xml");
XPathNavigator^ navigator = document->CreateNavigator();
XmlNamespaceManager^ manager = gcnew XmlNamespaceManager(navigator->NameTable);
manager->AddNamespace("bk", "http://www.contoso.com/books");
for each (XPathNavigator^ nav in navigator->Select("//bk:price", manager))
{
if(nav->Value == "11.99")
{
nav->SetValue("12.99");
}
}
Console::WriteLine(navigator->OuterXml);
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 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>
Insertion 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.
L'exemple suivant tente de modifier la valeur de l'élément price
du premier élément book
du fichier contosoBooks.xml
en valeur DateTime. Étant donné que le type de schéma XML de l'élément price
est défini comme xs:decimal
dans les fichiers contosoBooks.xsd
, une exception se produit.
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 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>
L'exemple prend également le fichier 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>
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 peuvent permettre d'insérer des nœuds et des valeurs dans un document XML. Pour plus d'informations sur l'utilisation des propriétés InnerXml et OuterXml pour insérer des nœuds et des valeurs, consultez la rubrique Modification de données XML à l’aide de XPathNavigator.
Conflits d'espace de noms et xml:lang
Certains conflits relatifs à la portée de l'espace de noms et aux déclarations xml:lang
peuvent survenir lors de l'insertion de données XML à l'aide des méthodes InsertBefore, InsertAfter, AppendChild et PrependChild de la classe XPathNavigator qui prend les objets XmlReader comme paramètres.
Les conflits d'espace de noms possibles sont les suivants.
Si un espace de noms se trouve dans la portée du contexte de l'objet XmlReader où le préfixe du mappage de l'URI d'espace de noms ne se trouve pas dans le contexte de l'objet XPathNavigator, une nouvelle déclaration d'espace de noms est ajoutée au nœud qui vient d'être inséré.
Si le même URI d'espace de noms se trouve dans la portée du contexte des objets XmlReader et XPathNavigator, mais dont le préfixe mappé est différent dans les deux contextes, une nouvelle déclaration d'espace de noms est ajoutée au nœud qui vient d'être inséré. Le préfixe et l'URI d'espace de noms de cette déclaration sont ceux de l'objet XmlReader.
Si le même préfixe d'espace de noms se trouve dans la portée du contexte des objets XmlReader et XPathNavigator, mais dont l'URI d'espace de noms mappé est différent dans les deux contextes, une nouvelle déclaration d'espace de noms est ajoutée au nœud qui vient d'être inséré. Celle-ci redéclare ce préfixe avec l'URI d'espace de noms provenant de l'objet XmlReader.
Si le préfixe et l'URI d'espace de noms sont identiques dans le contexte des objets XmlReader et XPathNavigator, aucune déclaration d'espace de noms n'est ajoutée au nœud qui vient d'être inséré.
Notes
La description ci-dessus s'applique également aux déclarations d'espaces de noms ayant pour préfixe la string
vide (par exemple, la déclaration d'espace de noms par défaut).
Les conflits xml:lang
possibles sont les suivants.
Si un attribut
xml:lang
se trouve dans la portée du contexte de l'objet XmlReader, mais pas de l'objet XPathNavigator, un attributxml:lang
dont la valeur est reprise dans l'objet XmlReader est ajouté au nœud qui vient d'être inséré.Si un attribut
xml:lang
se trouve dans la portée du contexte des objets XmlReader et XPathNavigator, mais si chacun présente une valeur différente, un attributxml:lang
dont la valeur est reprise dans l'objet XmlReader est ajouté au nœud qui vient d'être inséré.Si un attribut
xml:lang
se trouve dans la portée du contexte des objets XmlReader et XPathNavigator et si chacun présente la même valeur, aucun attributxml:lang
n'est ajouté au nœud qui vient d'être inséré.Si un attribut
xml:lang
se trouve dans la portée du contexte de l'objet XPathNavigator et si aucun n'existe dans le contexte de l'objet XmlReader, aucun attributxml:lang
n'est ajouté au nœud qui vient d'être inséré.
Insertion de nœuds avec XmlWriter
Les méthodes permettant d'insérer des nœuds frères, enfants et d'attribut décrites dans la section sur l'insertion de nœuds et de valeurs sont surchargées. Les méthodes InsertAfter, InsertBefore, AppendChild, PrependChild et CreateAttributes de la classe XPathNavigator retournent un objet XmlWriter permettant d'insérer des nœuds.
Méthodes XmlWriter non prises en charge
Toutes les méthodes permettant d’écrire des informations dans un document XML à l’aide de la classe XmlWriter ne sont pas prises en charge par la classe XPathNavigator en raison de la différence entre le modèle de données XPath et le DOM (Document Object Model).
Le tableau suivant décrit les méthodes de la classe XmlWriter non prises en charge par la classe XPathNavigator.
Méthode | Description |
---|---|
WriteEntityRef | Lève une exception NotSupportedException. |
WriteDocType | Ignorée au niveau racine et lève une exception NotSupportedException en cas d'appel à tout autre niveau du document XML. |
WriteCData | Traitée comme un appel à la méthode WriteString pour le ou les caractères équivalents. |
WriteCharEntity | Traitée comme un appel à la méthode WriteString pour le ou les caractères équivalents. |
WriteSurrogateCharEntity | Traitée comme un appel à la méthode WriteString pour le ou les caractères équivalents. |
Pour plus d'informations sur la classe XmlWriter, voir la documentation de référence sur la classe XmlWriter.
Objets XmlWriter multiples
Il est possible que plusieurs objets XPathNavigator pointent sur différentes parties d'un document XML avec au moins un objet XmlWriter ouvert. Plusieurs objets XmlWriter sont autorisés et pris en charge dans des scénarios monothread.
Les remarques suivantes sont importantes en cas d'utilisation de plusieurs objets XmlWriter.
Les fragments XML écrits par les objets XmlWriter sont ajoutés au document XML en cas d'appel de la méthode Close de chaque objet XmlWriter. Dans les autres cas, l'objet XmlWriter écrit un fragment déconnecté. Si une opération est effectuée sur le document XML, avant l'appel de XmlWriter, aucun fragment en cours d'écriture par un objet Close n'est affecté.
Si un objet XmlWriter ouvert existe dans une sous-arborescence XML particulière et si cette sous-arborescence est supprimée, l’objet XmlWriter peut encore être ajouté à la sous-arborescence. La sous-arborescence devient simplement un fragment supprimé.
Si plusieurs objets XmlWriter sont ouverts au même point du document XML, ils sont ajoutés au document XML dans l'ordre dans lequel les objets XmlWriter sont fermés, pas dans l'ordre dans lequel ils ont été ouverts.
L'exemple suivant crée un objet XmlDocument et un objet XPathNavigator, puis utilise l'objet XmlWriter retourné par la méthode PrependChild pour créer la structure du premier livre du fichier books.xml
. L'exemple l'enregistre ensuite comme fichier book.xml
.
Dim document As XmlDocument = New XmlDocument()
Dim navigator As XPathNavigator = document.CreateNavigator()
Using writer As XmlWriter = navigator.PrependChild()
writer.WriteStartElement("bookstore")
writer.WriteStartElement("book")
writer.WriteAttributeString("genre", "autobiography")
writer.WriteAttributeString("publicationdate", "1981-03-22")
writer.WriteAttributeString("ISBN", "1-861003-11-0")
writer.WriteElementString("title", "The Autobiography of Benjamin Franklin")
writer.WriteStartElement("author")
writer.WriteElementString("first-name", "Benjamin")
writer.WriteElementString("last-name", "Franklin")
writer.WriteElementString("price", "8.99")
writer.WriteEndElement()
writer.WriteEndElement()
writer.WriteEndElement()
End Using
document.Save("book.xml")
XmlDocument document = new XmlDocument();
XPathNavigator navigator = document.CreateNavigator();
using (XmlWriter writer = navigator.PrependChild())
{
writer.WriteStartElement("bookstore");
writer.WriteStartElement("book");
writer.WriteAttributeString("genre", "autobiography");
writer.WriteAttributeString("publicationdate", "1981-03-22");
writer.WriteAttributeString("ISBN", "1-861003-11-0");
writer.WriteElementString("title", "The Autobiography of Benjamin Franklin");
writer.WriteStartElement("author");
writer.WriteElementString("first-name", "Benjamin");
writer.WriteElementString("last-name", "Franklin");
writer.WriteElementString("price", "8.99");
writer.WriteEndElement();
writer.WriteEndElement();
writer.WriteEndElement();
}
document.Save("book.xml");
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.