Condividi tramite


Procedura: creare un documento con spazi dei nomi (C#) (LINQ to XML)

In questo argomento viene illustrato come creare documenti con spazi dei nomi.

Esempio

Per creare un elemento o un attributo in uno spazio dei nomi, è prima necessario dichiarare e inizializzare un oggetto XNamespace. È quindi possibile utilizzare 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, in LINQ to XML questo documento viene serializzato con uno spazio dei nomi predefinito.

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

L'output ottenuto eseguendo l'esempio è il seguente:

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

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

L'output ottenuto eseguendo l'esempio è il seguente:

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

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

Includendo gli attributi dello spazio dei nomi nell'elemento radice, gli spazi dei nomi vengono serializzati in modo che https://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" e senza spazio dei nomi. Il valore dell'attributo è l'URI dello spazio dei nomi predefinito.

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

L'output ottenuto eseguendo l'esempio è il seguente:

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

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

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

L'output ottenuto eseguendo l'esempio è il seguente:

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

È possibile ottenere lo stesso risultato anche utilizzando 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 esteso a LINQ to XML, LINQ to XML deve analizzare il nome, individuare lo spazio atomizzato e individuare il nome atomizzato. Questo processo impiega il tempo della CPU. Se le prestazioni sono importanti, è opportuno dichiarare e utilizzare un oggetto XNamespace in modo esplicito.

Se le prestazioni sono importanti, vedere Pre-atomizzazione di oggetti XName (LINQ to XML) per ulteriori informazioni

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

L'output ottenuto eseguendo l'esempio è il seguente:

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

Vedere anche

Concetti

Spazi dei nomi in C# (LINQ to XML)