Compartir a través de


Cómo crear un documento con espacios de nombres (C#) (LINQ to XML)

En este tema se muestra cómo crear documentos con espacios de nombres.

Ejemplo

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 = "https://www.adventure-works.com";
XElement root = new XElement(aw + "Root",
    new XElement(aw + "Child", "child content")
);
Console.WriteLine(root);

Este ejemplo genera el siguiente resultado:

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

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 = "https://www.adventure-works.com";
XElement root = new XElement(aw + "Root",
    new XAttribute(XNamespace.Xmlns + "aw", "https://www.adventure-works.com"),
    new XElement(aw + "Child", "child content")
);
Console.WriteLine(root);

Este ejemplo genera el siguiente resultado:

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

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 https://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 https://www.adventure-works.com namespace is forced to be the default namespace.
XNamespace aw = "https://www.adventure-works.com";
XNamespace fc = "www.fourthcoffee.com";
XElement root = new XElement(aw + "Root",
    new XAttribute("xmlns", "https://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 genera el siguiente resultado:

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

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

XNamespace aw = "https://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 genera el siguiente resultado:

<aw:Root xmlns:aw="https://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>

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, LINQ to XML 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 deba declarar y usar explícitamente un objeto XNamespace.

Si el rendimiento es un problema importante, vea Atomización previa de objetos XName (LINQ to XML) para obtener más información

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

Este ejemplo genera el siguiente resultado:

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

Vea también

Conceptos

Espacios de nombres en C# (LINQ to XML)