Procedimiento para crear un documento con espacios de nombres en C# (LINQ to XML)

En este artículo se muestra cómo crear documentos en C# que tienen espacios de nombres.

Ejemplo: Declarar e inicializar un espacio de nombres predeterminado

Para crear un elemento o un atributo que se encuentra en un espacio de nombres, primero debe declarar e inicializar un objeto XNamespace. A continuación debe utilizar la sobrecarga del operador de suma para combinar el espacio de nombres con el nombre local, expresado como una cadena.

En el ejemplo siguiente se crea un documento con un espacio de nombres. De forma predeterminada, LINQ to XML serializa este documento con un espacio de nombres predeterminado.

// Create an XML tree in a namespace.
XNamespace aw = "http://www.adventure-works.com";
XElement root = new XElement(aw + "Root",
    new XElement(aw + "Child", "child content")
);
Console.WriteLine(root);

Este ejemplo produce el siguiente resultado:

<Root xmlns="http://www.adventure-works.com">
  <Child>child content</Child>
</Root>

Ejemplo: Creación de un documento que tenga un espacio de nombres y un atributo

En el ejemplo siguiente se crea un documento con un espacio de nombres. También crea un atributo que declara el espacio de nombres con un prefijo. Para crear un atributo que declara un espacio de nombres con un prefijo, debe crearlo de modo que el nombre del atributo sea el prefijo del espacio de nombres y el nombre se encuentre en el espacio de nombres Xmlns. El valor de este atributo es el URI del espacio de nombres.

// Create an XML tree in a namespace, with a specified prefix
XNamespace aw = "http://www.adventure-works.com";
XElement root = new XElement(aw + "Root",
    new XAttribute(XNamespace.Xmlns + "aw", "http://www.adventure-works.com"),
    new XElement(aw + "Child", "child content")
);
Console.WriteLine(root);

Este ejemplo produce el siguiente resultado:

<aw:Root xmlns:aw="http://www.adventure-works.com">
  <aw:Child>child content</aw:Child>
</aw:Root>

Ejemplo: Creación de un documento con dos espacios de nombres, uno con un prefijo

El ejemplo siguiente muestra la creación de un documento que contiene dos espacios de nombres. Uno es el espacio de nombres predeterminado, el otro es un espacio de nombres con un prefijo.

Mediante la inclusión de los atributos de espacios de nombres en el elemento raíz, los espacios de nombres se serializan de modo que http://www.adventure-works.com sea el espacio de nombres predeterminado y www.fourthcoffee.com se serialice con un prefijo fc. Para crear un atributo que declare un espacio de nombres predeterminado, debe crear un atributo con el nombre xmlns, sin un espacio de nombres. El valor del atributo es el URI del espacio de nombres predeterminado.

// The http://www.adventure-works.com namespace is forced to be the default namespace.
XNamespace aw = "http://www.adventure-works.com";
XNamespace fc = "www.fourthcoffee.com";
XElement root = new XElement(aw + "Root",
    new XAttribute("xmlns", "http://www.adventure-works.com"),
    new XAttribute(XNamespace.Xmlns + "fc", "www.fourthcoffee.com"),
    new XElement(fc + "Child",
        new XElement(aw + "DifferentChild", "other content")
    ),
    new XElement(aw + "Child2", "c2 content"),
    new XElement(fc + "Child3", "c3 content")
);
Console.WriteLine(root);

Este ejemplo produce el siguiente resultado:

<Root xmlns="http://www.adventure-works.com" xmlns:fc="www.fourthcoffee.com">
  <fc:Child>
    <DifferentChild>other content</DifferentChild>
  </fc:Child>
  <Child2>c2 content</Child2>
  <fc:Child3>c3 content</fc:Child3>
</Root>

Ejemplo: Creación de un documento con dos espacios de nombres, ambos con prefijos

En el ejemplo siguiente se crea un documento que contiene dos espacios de nombres, todos ellos con prefijos de espacio de nombres.

XNamespace aw = "http://www.adventure-works.com";
XNamespace fc = "www.fourthcoffee.com";
XElement root = new XElement(aw + "Root",
    new XAttribute(XNamespace.Xmlns + "aw", aw.NamespaceName),
    new XAttribute(XNamespace.Xmlns + "fc", fc.NamespaceName),
    new XElement(fc + "Child",
        new XElement(aw + "DifferentChild", "other content")
    ),
    new XElement(aw + "Child2", "c2 content"),
    new XElement(fc + "Child3", "c3 content")
);
Console.WriteLine(root);

Este ejemplo produce el siguiente resultado:

<aw:Root xmlns:aw="http://www.adventure-works.com" xmlns:fc="www.fourthcoffee.com">
  <fc:Child>
    <aw:DifferentChild>other content</aw:DifferentChild>
  </fc:Child>
  <aw:Child2>c2 content</aw:Child2>
  <fc:Child3>c3 content</fc:Child3>
</aw:Root>

Ejemplo: Creación de un espacio de nombres con nombres expandidos

Otro método para conseguir el mismo resultado consiste en usar nombres expandidos en lugar de declarar y crear un objeto XNamespace.

Este método tiene implicaciones en el rendimiento. Cada vez que pasa una cadena que contiene un nombre expandido a LINQ to XML, este debe analizar el nombre, buscar el espacio de nombres atomizado y buscar el nombre atomizado. Este proceso consume tiempo de la CPU. Si el rendimiento es importante, tal vez quiera declarar y usar explícitamente un objeto XNamespace.

Si el rendimiento es un problema importante, consulte Atomización previa de objetos XName para más información.

// Create an XML tree in a namespace, with a specified prefix
XElement root = new XElement("{http://www.adventure-works.com}Root",
    new XAttribute(XNamespace.Xmlns + "aw", "http://www.adventure-works.com"),
    new XElement("{http://www.adventure-works.com}Child", "child content")
);
Console.WriteLine(root);

Este ejemplo produce el siguiente resultado:

<aw:Root xmlns:aw="http://www.adventure-works.com">
  <aw:Child>child content</aw:Child>
</aw:Root>

Consulte también