Come creare un documento con spazi dei nomi in C# (LINQ to XML)

Questo articolo illustra come creare documenti in C# con spazi dei nomi.

Esempio: dichiarare e inizializzare uno spazio dei nomi predefinito

Per creare un elemento o un attributo in uno spazio dei nomi, è prima necessario dichiarare e inizializzare un oggetto XNamespace. È quindi possibile usare l'overload dell'operatore di addizione per combinare lo spazio dei nomi con il nome locale, espresso come stringa.

Nell'esempio seguente viene creato un documento con un solo spazio dei nomi. Per impostazione predefinita, LINQ to XML serializza questo documento con uno spazio dei nomi predefinito.

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

Nell'esempio viene prodotto l'output seguente:

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

Esempio: creare un documento con uno spazio dei nomi e un attributo

Nell'esempio seguente viene creato un documento con un solo spazio dei nomi. nonché un attributo che dichiara lo spazio dei nomi con un prefisso. Per creare un attributo che dichiara uno spazio dei nomi con un prefisso, è possibile creare un attributo il cui nome è il prefisso dello spazio dei nomi e tale nome si trova nello spazio dei nomi Xmlns. Il valore di questo attributo è l'URI dello spazio dei nomi.

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

Nell'esempio viene prodotto l'output seguente:

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

Esempio: creare un documento con due spazi dei nomi, uno con un prefisso

Nell'esempio seguente è illustrata la creazione di un documento che contiene due spazi dei nomi. Uno è lo spazio dei nomi predefinito, l'altro è uno spazio dei nomi con un prefisso.

Se si includono gli attributi dello spazio dei nomi nell'elemento radice, gli spazi dei nomi vengono serializzati in modo tale che http://www.adventure-works.com corrisponda allo spazio dei nomi predefinito e www.fourthcoffee.com venga serializzato con il prefisso fc. Per creare un attributo che dichiara uno spazio dei nomi predefinito, viene creato un attributo denominato xmlns senza spazio dei nomi. Il valore dell'attributo è l'URI dello spazio dei nomi predefinito.

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

Nell'esempio viene prodotto l'output seguente:

<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>

Esempio: creare un documento con due spazi dei nomi, entrambi con prefisso

Nell'esempio seguente viene creato un documento contenente due spazi dei nomi, entrambi con prefisso.

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

Nell'esempio viene prodotto l'output seguente:

<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>

Esempio: creare uno spazio dei nomi usando nomi espansi

È possibile ottenere lo stesso risultato anche usando nomi espansi anziché dichiarando e creando un oggetto XNamespace.

Questo approccio può tuttavia incidere sulle prestazioni. Ogni volta che si passa una stringa che contiene un nome espanso a LINQ to XML, LINQ to XML deve analizzare il nome, individuare lo spazio dei nomi atomizzato e individuare il nome atomizzato. Questo processo impiega il tempo della CPU. Se le prestazioni sono importanti, è consigliabile dichiarare e usare un oggetto XNamespace in modo esplicito.

Se le prestazioni rappresentano un problema rilevante, per altre informazioni vedere Pre-atomizzazione di oggetti XName.

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

Nell'esempio viene prodotto l'output seguente:

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

Vedi anche