Prefissi dello spazio dei nomi degli attributi in XmlTextWriter

Sono disponibili diversi modi per gestire i prefissi dello spazio dei nomi per un attributo con XmlTextWriter: WriteAttributes, WriteAttributeString e WriteStartAttribute.

WriteAttributes

Se la posizione corrente è un nodo di elemento, il metodo WriteAttributes scrive in XmlReader tutti gli attributi presenti nella posizione corrente. Se XmlReader ha un prefisso dello spazio dei nomi dichiarato, il metodo WriteAttributes scriverà il prefisso dello spazio dei nomi oltre agli attributi. Nell'esempio di codice riportato di seguito viene illustrato come il metodo WriteAttributes scrive il prefisso dello spazio dei nomi con l'attributo.

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()
[C#]
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();

Output

<ROOT p:a="abc" xmlns:p="n" />

WriteAttributeString

Un altro modo per gestire i prefissi in uno spazio dei nomi, consiste nel fare in modo che l'applicazione utilizzi uno dei metodi WriteAttributeString che accettano uno spazio dei nomi come prefisso. Uno dei metodi WriteAttributeString accetta, come parametri, un nome di attributo, un valore di attributo e uno spazio dei nomi e riporta l'attributo con il valore dato, associandolo allo spazio dei nomi.

Un altro dei metodi WriteAttributeString utilizza un prefisso dello spazio dei nomi definito dall'utente e associa l'attributo al prefisso quando scrive l'attributo. Per un esempio di codice che mostra come utilizzare il metodo WriteAttributeString e un prefisso dello spazio dei nomi definito dall'utente, vedere Metodo XmlWriter.WriteAttributeString (String, String, String).

WriteStartAttribute

WriteStartAttribute genera l'inizio di un attributo e in più accetta come parametro un prefisso dello spazio dei nomi o un URI dello spazio dei nomi, a seconda del metodo utilizzato.

Nell'esempio di codice riportato di seguito, il primo argomento di input è una stringa che accetta il prefisso dello spazio dei nomi bk, individuato richiamando il metodo LookupPrefix. Dopo l'impostazione di prefisso, nome locale e spazio dei nomi con WriteStartAttribute, il metodo WriteString fornisce un valore all'attributo.

' 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")
' Lookup 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()
                
[C#]
// 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");
// Lookup 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();

Output

<bookstore xmlns:bk="urn:samples">
  <book bk:ISBN="1-861003-78">
      <bk:style>hardcover</bk:style>
  </book>
</bookstore>

Se gli attributi sono associati a un URI dello spazio dei nomi, l'attributo deve avere anche un prefisso, in base a Namespace Defaulting nella raccomandazione Namespaces in XML del W3C (informazioni in lingua inglese). Nell'esempio di codice riportato di seguito, viene dimostrato che il prefisso deve essere incluso quando si scrive un attributo con il metodo WriteAttributeString.

Dim w As New XmlTextWriter(Console.Out)
w.WriteStartElement("root")
w.WriteAttributeString("order", "urn:1", "123")
w.WriteEndElement()
w.Close()
[C#]
XmlTextWriter w = new XmlTextWriter(Console.Out);
w.WriteStartElement("root");
w.WriteAttributeString("order","urn:1", "123");
w.WriteEndElement();
w.Close();

Output

<root n1:order="123" xmlns:n1="urn:1"/>

Questo output si verifica anche se l'elemento root è associato allo spazio dei nomi predefinito urn:1. I prefissi sono denominati n{i} dove i inizia da 1. L'indice inizia da 1 per ogni elemento. Per questo motivo, se un elemento figlio nidificato necessita anch'esso di un prefisso generato, verrà utilizzato n1.

Nell'esempio di codice riportato di seguito, viene dimostrato che gli attributi sono scritti prima delle dichiarazioni dello spazio dei nomi, quando si scrivono più attributi con spazi dei nomi diversi.

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()
[C#]
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();

Output

<root n1:order="123" n2:book="The Great Escape" xmlns:n1="urn:1" xmlns:n2="urn:2"/>

Vedere anche

Classe XmlTextWriter | Membri XmlTextWriter | Classe XmlWriter | Membri XmlWriter