Préfixes d'espaces de noms d'attributs dans XmlTextWriter
Il existe différentes méthodes pour gérer les préfixes d'espaces de noms d'un attribut à l'aide de XmlTextWriter : WriteAttributes, WriteAttributeString et WriteStartAttribute.
WriteAttributes
Si la position actuelle est un nœud d'élément, la méthode WriteAttributes écrit tous les attributs trouvés à la position actuelle de XmlReader. Si la position actuelle est définie sur un attribut, l'attribut et tous les attributs restants dans l'élément sont retournés. Si la position est définie sur un type de nœud XmlDeclaration, tous les attributs de la déclaration sont écrits. Tous les autres types de nœud n'ont pas d'opération. Si XmlReader possède un préfixe d'espace de noms déclaré, la méthode WriteAttributes écrit le préfixe d'espace de noms en plus des attributs. L'exemple suivant montre comment la méthode WriteAttributes écrit le préfixe d'espace de noms avec l'attribut.
Dim r As XmlTextReader = CreateTextReaderStr("<ROOT xmlns:p='n' p:a='abc'/>")
r.Read()
r.MoveToAttribute("p:a")
Dim tw As New XmlTextWriter(Console.Out)
tw.WriteStartElement("ROOT")
tw.WriteAttributes(r, False)
tw.WriteEndElement()
XmlTextReader r = CreateTextReaderStr("<ROOT xmlns:p='n' p:a='abc'/>");
r.Read();
r.MoveToAttribute("p:a");
XmlTextWriter tw = new XmlTextWriter(Console.Out);
tw.WriteStartElement("ROOT");
tw.WriteAttributes(r, false);
tw.WriteEndElement();
Sortie
<ROOT p:a="abc" xmlns:p="n" />
WriteAttributeString
Une autre manière de gérer les préfixes dans un espace de noms consiste à ce que l'application utilise l'une des méthodes WriteAttributeString qui utilise un espace de noms comme préfixe. Une des méthodes WriteAttributeString prend comme arguments un nom d'attribut, une valeur d'attribut et un espace de noms, et écrit l'attribut avec la valeur donnée puis l'associe à l'espace de noms.
Une autre des méthodes WriteAttributeString utilise un préfixe d'espace de noms défini par l'utilisateur et l'associe à l'attribut lors de son écriture. Pour un exemple de code montrant l'utilisation de la méthode WriteAttributeString et d'un préfixe d'espace de noms défini par l'utilisateur, voir WriteAttributeString.
WriteStartAttribute
La méthode WriteStartAttribute génère le début d'un attribut et prend comme paramètre un préfixe ou un URI (Uniform Resource Identifier) d'espace de noms selon la méthode utilisée.
Dans l'exemple de code suivant, le premier argument de l'entrée est une chaîne qui utilise le préfixe d'espace de noms bk, que l'on obtient en appelant la méthode LookupPrefix. Une fois le préfixe, le nom local et l'espace de noms définis à l'aide de WriteStartAttribute, la méthode WriteString donne une valeur à l'attribut.
' Write an element (this one is the root).
writer.WriteStartElement("bookstore")
' Write the namespace declaration.
writer.WriteAttributeString("xmlns", "bk", Nothing, "urn:samples")
writer.WriteStartElement("book")
' Look up the prefix, and then write the ISBN attribute.
Dim prefix As String = writer.LookupPrefix("urn:samples")
writer.WriteStartAttribute(prefix, "ISBN", "urn:samples")
writer.WriteString("1-861003-78")
writer.WriteEndAttribute()
' Write the style element.
writer.WriteStartElement(prefix, "style", "urn:samples")
writer.WriteString("hardcover")
writer.WriteEndElement()
' Write the end tag for the book element.
writer.WriteEndElement()
'Write the close tag for the root element.
writer.WriteEndElement()
// Write an element (this one is the root).
writer.WriteStartElement("bookstore");
// Write the namespace declaration.
writer.WriteAttributeString("xmlns", "bk", null, "urn:samples");
writer.WriteStartElement("book");
// Look up the prefix, and then write the ISBN attribute.
string prefix = writer.LookupPrefix("urn:samples");
writer.WriteStartAttribute(prefix, "ISBN", "urn:samples");
writer.WriteString("1-861003-78");
writer.WriteEndAttribute();
// Write the style element.
writer.WriteStartElement(prefix, "style", "urn:samples");
writer.WriteString("hardcover");
writer.WriteEndElement();
// Write the end tag for the book element.
writer.WriteEndElement();
// Write the close tag for the root element.
writer.WriteEndElement();
Sortie
<bookstore xmlns:bk="urn:samples">
<book bk:ISBN="1-861003-78">
<bk:style>hardcover</bk:style>
</book>
</bookstore>
Si les attributs ont un URI d'espace de noms associé, l'attribut doit également avoir un préfixe conforme aux règles applicables aux espaces de noms par défaut de la recommandation XML concernant les espaces de noms du World Wide Web Consortium (W3C). L'exemple de code suivant montre que le préfixe doit être inclus avec la méthode WriteAttributeString lors de l'écriture d'un attribut.
Dim w As New XmlTextWriter(Console.Out)
w.WriteStartElement("root")
w.WriteAttributeString("order", "urn:1", "123")
w.WriteEndElement()
w.Close()
XmlTextWriter w = new XmlTextWriter(Console.Out);
w.WriteStartElement("root");
w.WriteAttributeString("order","urn:1", "123");
w.WriteEndElement();
w.Close();
Sortie
<root n1:order="123" xmlns:n1="urn:1"/>
On obtient cette sortie même si l'élément root est associé à l'espace de noms par défaut urn:1. Les préfixes sont nommés n{i} où i commence à 1. L'index est réinitialisé à 1 pour chaque élément. C'est pourquoi, si un élément enfant imbriqué requiert également la génération d'un préfixe, il utilise n1.
L'exemple de code suivant montre que les attributs sont écrits avant les déclarations d'espace de noms, lors de l'écriture de plusieurs attributs avec différents espaces de noms.
Dim w As New XmlTextWriter(Console.Out)
w.WriteStartElement("root")
w.WriteAttributeString("order", "urn:1", "123")
w.WriteAttributeString("book", "urn:2", "The Great Escape")
w.WriteEndElement()
w.Close()
XmlTextWriter w = new XmlTextWriter(Console.Out);
w.WriteStartElement("root");
w.WriteAttributeString("order","urn:1", "123");
w.WriteAttributeString("book","urn:2", "The Great Escape");
w.WriteEndElement();
w.Close();
Sortie
<root n1:order="123" n2:book="The Great Escape" xmlns:n1="urn:1" xmlns:n2="urn:2"/>