Prefijos de espacio de nombres de atributo de XmlTextWriter

Actualización: November 2007

Hay múltiples maneras de controlar prefijos de espacio de nombres para un atributo con XmlTextWriter: WriteAttributes, WriteAttributeString, y WriteStartAttribute.

WriteAttributes

Si la posición actual es un nodo de elemento, el método WriteAttributes escribe todos los atributos encontrados en la posición actual del XmlReader. Si la posición actual se establece en un atributo, el atributo y todos los atributos restantes en el elemento son devueltos. Si la posición se establece en XmlDeclaration NodeType, entonces todos los atributos de la declaración se escriben. Todos los demás NodeTypes no funcionan. Si el XmlReader tiene declarado un prefijo de espacio de nombres, el método WriteAttributes lo escribe además de los atributos. En el ejemplo de código siguiente se muestra la forma en que el método WriteAttributes escribe el prefijo de espacio de nombres con el atributo.

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();

Resultados

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

WriteAttributeString

Otra forma de controlar los prefijos en un espacio de nombres es hacer que la aplicación utilice uno de los métodos WriteAttributeString que aceptan un espacio de nombres como prefijo. Uno de los métodos WriteAttributeString acepta, como argumentos, un nombre y un valor de atributo y un espacio de nombres, y escribe en el atributo el valor especificado y lo asocia con el espacio de nombres.

Otro de los métodos WriteAttributeString utiliza un prefijo de espacio de nombres definido por el usuario y asocia el atributo con el prefijo al escribir éste. Si desea ver ejemplos de código acerca de cómo utilizar el método WriteAttributeString y un prefijo de espacio de nombres definido por el usuario, vea WriteAttributeString.

WriteStartAttribute

El método WriteStartAttribute genera el principio de un atributo y, además, recibe un prefijo o un identificador de recursos uniforme (URI) de espacio de nombres como parámetro, según el método usado.

En el ejemplo de código siguiente el argumento de la primera entrada es una cadena que recibe el prefijo de espacio de nombres bk, que se busca al llamar al método LookupPrefix. Una vez que el prefijo, el nombre local y el espacio de nombres se han establecido mediante el método WriteStartAttribute, el método WriteString asigna un valor al atributo.

' 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();

Resultados

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

Si los atributos tienen asociado un URI de espacio de nombres, el atributo también debe tener un prefijo, de acuerdo con las opciones predeterminadas para los espacios de nombres establecidas en la recomendación de XML del W3C acerca de los espacios de nombres. En el ejemplo de código siguiente se muestra que, al escribir un atributo con el método WriteAttributeString, se debe incluir el prefijo.

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();

Resultados

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

Este resultado ocurre si el elemento root se relaciona con el espacio de nombres relacionado urn:1. Los prefijos son denominados n{i} donde i comienza en 1. El índice comienza de nuevo en 1 para cada elemento. Por tanto, si un elemento secundario anidado necesita igualmente un prefijo generado, utiliza n1.

En el ejemplo de código siguiente se muestra que los atributos se escriben antes de las declaraciones de espacio de nombres, cuando se escriben varios atributos con espacios de nombres diferentes.

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();

Resultados

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

Vea también

Referencia

XmlTextWriter

XmlTextWriter

XmlWriter

XmlWriter