Come creare un documento con namespace in C# (LINQ to XML)
Questo articolo mostra come creare documenti in C# con namespace.
Esempio: dichiarare e inizializzare uno spazio dei nomi predefinito
Per creare un elemento o un attributo che si trova in uno spazio dei nomi, è necessario innanzitutto dichiarare e inizializzare un oggetto XNamespace. Poi utilizzi il sovraccarico dell'operatore di somma per combinare lo spazio dei nomi con il nome locale, espresso come stringa.
Nell'esempio seguente viene creato un documento con un namespace. 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);
In questo esempio viene generato l'output seguente:
<Root xmlns="http://www.adventure-works.com">
<Child>child content</Child>
</Root>
Esempio: Creare un documento con un namespace e un attributo
Nell'esempio seguente viene creato un documento con un namespace. Crea anche un attributo che dichiara lo spazio dei nomi con un prefisso dello spazio dei nomi. Per creare un attributo che dichiara uno spazio dei nomi con un prefisso, creare un attributo in cui il nome dell'attributo è il prefisso dello spazio dei nomi e questo 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);
In questo esempio viene generato 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 namespace, uno con un prefisso
Nell'esempio seguente è illustrata la creazione di un documento che contiene due namespace. 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 http://www.adventure-works.com
sia lo spazio dei nomi predefinito e www.fourthcoffee.com
venga serializzato con un prefisso di 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.
Se una dichiarazione di spazio dei nomi predefinita è in vigore, si applica agli oggetti XElement
figli anteponendo ai loro nomi locali l'oggetto XNamespace
corrispondente. D'altra parte, le dichiarazioni di spazio dei nomi predefinite non si applicano direttamente ai nomi degli attributi. Pertanto, gli oggetti XAttribute
nello spazio dei nomi predefinito sono definiti da anziché da aggiungendo il nome corrispondente dell'oggetto XNamespace
come prefisso.
// 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);
In questo esempio viene generato l'output seguente:
<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>
Esempio: Crea un documento con due namespace, entrambi con prefissi
Nell'esempio seguente viene creato un documento contenente due spazi dei namespace, entrambi con prefissi di namespace.
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);
In questo esempio viene generato 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
Un altro modo per ottenere lo stesso risultato consiste nell'usare nomi espansi anziché dichiarare e creare un oggetto XNamespace.
Questo approccio ha implicazioni sulle prestazioni. Ogni volta che si passa una stringa contenente un nome espanso a LINQ to XML, LINQ to XML deve analizzare il nome, trovare lo spazio dei nomi atomizzato e trovare il nome atomizzato. Questo processo richiede tempo per la CPU. Se le prestazioni sono importanti, è possibile dichiarare e usare un oggetto XNamespace in modo esplicito.
Se le prestazioni sono un problema importante, vedi Pre-atomizzazione degli Oggetti XName per ulteriori 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);
In questo esempio viene generato l'output seguente:
<aw:Root xmlns:aw="http://www.adventure-works.com">
<aw:Child>child content</aw:Child>
</aw:Root>