Partager via


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

Mise à jour : November 2007

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, voir 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.

Dim document As XmlDocument = New XmlDocument()
document.Load("contosoBooks.xml")
Dim navigator As XPathNavigator = document.CreateNavigator()

navigator.MoveToChild("bookstore", "https://www.contoso.com/books")
navigator.MoveToChild("book", "https://www.contoso.com/books")
navigator.MoveToChild("price", "https://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", "https://www.contoso.com/books");
navigator.MoveToChild("book", "https://www.contoso.com/books");
navigator.MoveToChild("price", "https://www.contoso.com/books");

navigator.InsertBefore("<pages>100</pages>");

navigator.MoveToParent();
Console.WriteLine(navigator.OuterXml);
XmlDocument^ document = gcnew XmlDocument();
document->Load("contosoBooks.xml");
XPathNavigator^ navigator = document->CreateNavigator();

navigator->MoveToChild("bookstore", "https://www.contoso.com/books");
navigator->MoveToChild("book", "https://www.contoso.com/books");
navigator->MoveToChild("price", "https://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.

<bookstore xmlns="https://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.

Dim document As XmlDocument = New XmlDocument()
document.Load("contosoBooks.xml")
Dim navigator As XPathNavigator = document.CreateNavigator()

navigator.MoveToChild("bookstore", "https://www.contoso.com/books")
navigator.MoveToChild("book", "https://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", "https://www.contoso.com/books");
navigator.MoveToChild("book", "https://www.contoso.com/books");

navigator.AppendChild("<pages>100</pages>");

Console.WriteLine(navigator.OuterXml);
XmlDocument^ document = gcnew XmlDocument();
document->Load("contosoBooks.xml");
XPathNavigator^ navigator = document->CreateNavigator();

navigator->MoveToChild("bookstore", "https://www.contoso.com/books");
navigator->MoveToChild("book", "https://www.contoso.com/books");

navigator->AppendChild("<pages>100</pages>");

Console::WriteLine(navigator->OuterXml);

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

<bookstore xmlns="https://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.

Dim document As XmlDocument = New XmlDocument()
document.Load("contosoBooks.xml")
Dim navigator As XPathNavigator = document.CreateNavigator()

navigator.MoveToChild("bookstore", "https://www.contoso.com/books")
navigator.MoveToChild("book", "https://www.contoso.com/books")
navigator.MoveToChild("price", "https://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)
XmlDocument document = new XmlDocument();
document.Load("contosoBooks.xml");
XPathNavigator navigator = document.CreateNavigator();

navigator.MoveToChild("bookstore", "https://www.contoso.com/books");
navigator.MoveToChild("book", "https://www.contoso.com/books");
navigator.MoveToChild("price", "https://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 = gcnew XmlDocument();
document->Load("contosoBooks.xml");
XPathNavigator^ navigator = document->CreateNavigator();

navigator->MoveToChild("bookstore", "https://www.contoso.com/books");
navigator->MoveToChild("book", "https://www.contoso.com/books");
navigator->MoveToChild("price", "https://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);

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

<bookstore xmlns="https://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.

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", "https://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)
XmlDocument document = new XmlDocument();
document.Load("contosoBooks.xml");
XPathNavigator navigator = document.CreateNavigator();

XmlNamespaceManager manager = new XmlNamespaceManager(navigator.NameTable);
manager.AddNamespace("bk", "https://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);
XmlDocument^ document = gcnew XmlDocument();
document->Load("contosoBooks.xml");
XPathNavigator^ navigator = document->CreateNavigator();

XmlNamespaceManager^ manager = gcnew XmlNamespaceManager(navigator->NameTable);
manager->AddNamespace("bk", "https://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);

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

<bookstore xmlns="https://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("https://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", "https://www.contoso.com/books")
navigator.MoveToChild("book", "https://www.contoso.com/books")
navigator.MoveToChild("price", "https://www.contoso.com/books")

navigator.SetTypedValue(DateTime.Now)
XmlReaderSettings settings = new XmlReaderSettings();
settings.Schemas.Add("https://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", "https://www.contoso.com/books");
navigator.MoveToChild("book", "https://www.contoso.com/books");
navigator.MoveToChild("price", "https://www.contoso.com/books");

navigator.SetTypedValue(DateTime.Now);

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

<bookstore xmlns="https://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="https://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 l'insertion de nœuds et de valeurs, voir 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é.

Remarque :

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 attribut xml: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 attribut xml: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 attribut xml: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 attribut xml: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ère(s) équivalent(s).

WriteCharEntity

Traitée comme un appel à la méthode WriteString pour le ou les caractère(s) équivalent(s).

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 Close, aucun fragment en cours d'écriture par un objet XmlWriter 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, voir Enregistrement et écriture d'un document.

Voir aussi

Concepts

Traitement des données XML à l'aide du modèle de données XPath

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

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

Référence

XmlDocument

XPathDocument

XPathNavigator