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 di tutto necessario dichiarare e inizializzare un XNamespace oggetto . È 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 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.

Includendo gli attributi dello spazio dei nomi nell'elemento radice, gli spazi dei nomi vengono serializzati in modo che sia lo spazio dei nomi predefinito e serializzati http://www.adventure-works.com www.fourthcoffee.com con un prefisso fc . Per creare un attributo che dichiara uno spazio dei nomi predefinito, creare un attributo con il nome xmlns , senza uno 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 prefissi

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 LINQ to XML, LINQ to XML deve analizzare il nome, trovare lo spazio dei nomi atomizzato e trovare 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 sono un problema importante, vedere Pre-Atomizzazione degli oggetti XName per altre informazioni.

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