Cómo 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 se declara e inicializa 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);
En este ejemplo se genera la siguiente salida:
<Root xmlns="http://www.adventure-works.com">
<Child>child content</Child>
</Root>
Ejemplo: Crear un documento que tenga un espacio de nombres y un atributo
En el siguiente ejemplo se crea un documento con un único espacio de nombres. También crea un atributo que declara un espacio de nombres utilizando un prefijo de ese espacio de nombres. Para crear un atributo que declare un espacio de nombres con un prefijo, cree un atributo donde el nombre del atributo sea el prefijo de espacio de nombres y este nombre se encuentra 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);
En este ejemplo se genera la siguiente salida:
<aw:Root xmlns:aw="http://www.adventure-works.com">
<aw:Child>child content</aw:Child>
</aw:Root>
Ejemplo: Crear un documento que tenga dos espacios de nombres, uno con un prefijo
En el ejemplo siguiente se 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.
Al incluir atributos de espacio de nombres en el elemento raíz, los espacios de nombres se serializan para que http://www.adventure-works.com
sea el espacio de nombres predeterminado y www.fourthcoffee.com
se serialice con un prefijo de fc
. Para crear un atributo que declare un espacio de nombres predeterminado, cree un atributo con el nombre xmlns
, sin un espacio de nombres. El valor del atributo es el URI del espacio de nombres predeterminado.
Si una declaración de espacio de nombres predeterminado está en el ámbito, se aplica a los objetos secundarios XElement
anteponiendo a sus nombres locales el objeto XNamespace
correspondiente. Por otro lado, las declaraciones de espacio de nombres predeterminadas no se aplican directamente a los nombres de atributo. Por lo tanto, los objetos XAttribute
del espacio de nombres predeterminado se definen al prefijar su nombre local con el objeto XNamespace
correspondiente, no .
// 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 XAttribute("DefaultNs", "default namespace"),
new XAttribute(fc + "PrefixedNs", "prefixed namespace")
),
new XElement(fc + "Child3", "c3 content",
new XAttribute("DefaultNs", "default namespace"),
new XAttribute(fc + "PrefixedNs", "prefixed namespace")
)
);
Console.WriteLine(root);
En este ejemplo se genera la siguiente salida:
<Root xmlns="http://www.adventure-works.com" xmlns:fc="www.fourthcoffee.com">
<fc:Child>
<DifferentChild>other content</DifferentChild>
</fc:Child>
<Child2 DefaultNs="default namespace" fc:PrefixedNs="prefixed namespace">c2 content</Child2>
<fc:Child3 DefaultNs="default namespace" fc:PrefixedNs="prefixed namespace">c3 content</fc:Child3>
</Root>
Ejemplo: Crear un documento que tenga 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);
En este ejemplo se genera la siguiente salida:
<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
Otra manera de lograr el mismo resultado es usar nombres expandidos en lugar de declarar y crear un objeto XNamespace.
Este enfoque tiene implicaciones de rendimiento. Cada vez que pase una cadena que contenga 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 tarda tiempo en la CPU. Si el rendimiento es importante, es posible que desee declarar y usar un objeto XNamespace explícitamente.
Si el rendimiento es un problema importante, consulte atomización previa de objetos XName para obtener 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);
En este ejemplo se genera la siguiente salida:
<aw:Root xmlns:aw="http://www.adventure-works.com">
<aw:Child>child content</aw:Child>
</aw:Root>