Gewusst wie: Erstellen eines Dokuments mit Namespaces (C#) (LINQ to XML)

In diesem Thema wird das Erstellen von Dokumenten mit Namespaces beschrieben.

Beispiel

Wenn Sie ein Element oder Attribut erstellen möchten, das sich in einem Namespace befindet, deklarieren und initialisieren Sie zuerst ein <xref:System.Xml.Linq.XNamespace>-Objekt. Anschließend verwenden Sie die Additionsoperatorüberladung, um den Namespace mit dem lokalen Namen in Form einer Zeichenfolge zu kombinieren.

Das folgende Beispiel erstellt ein Dokument mit nur einem Namespace. Standardmäßig serialisiert LINQ to XML dieses Dokument mit einem Standardnamespace.

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

Dieses Beispiel erzeugt die folgende Ausgabe:

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

Beispiel

Das folgende Beispiel erstellt ein Dokument mit nur einem Namespace. Es erstellt auch ein Attribut, das den Namespace mit einem Namespacepräfix deklariert. Gehen Sie zum Erstellen eines Attributs, das einen Namespace mit einem Präfix deklariert, wie folgt vor. Erstellen Sie ein Attribut, bei dem der Name des Attributs das Namespacepräfix darstellt. Dieser Name befindet sich im <xref:System.Xml.Linq.XNamespace.Xmlns%2A>-Namespace. Der Wert dieses Attributs ist der URI des Namespace.

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

Dieses Beispiel erzeugt die folgende Ausgabe:

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

Beispiel

Das folgende Beispiel zeigt das Erstellen eines Dokuments, das zwei Namespaces enthält. Einer der Namespaces ist der Standardnamespace. Der andere Namespace besitzt ein Präfix.

Durch das Aufnehmen von Namespaceattributen in das Stammelement werden die Namespaces so serialisiert, dass "http://www.adventure-works.com" zum Standardnamespace wird und "www.fourthcoffee.com" mit dem Präfix "fc" serialisiert wird. Zum Erstellen eines Attributs, das einen Standardnamespace deklariert, erstellen Sie ein Attribut mit dem Namen xmlns ohne einen Namespace. Der Wert des Attributs ist der Standardnamespace-URI.

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

Dieses Beispiel erzeugt die folgende Ausgabe:

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

Beispiel

Das folgende Beispiel erstellt ein Dokument, das zwei Namespaces enthält, die beide ein Namespacepräfix besitzen.

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

Dieses Beispiel erzeugt die folgende Ausgabe:

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

Beispiel

Dasselbe Ergebnis lässt sich erzielen, indem statt des Deklarierens und Erstellens eines <xref:System.Xml.Linq.XNamespace>-Objekts erweiterte Namen verwendet werden.

Dieser Ansatz wirkt sich aber negativ auf die Leistung aus. Jedes Mal, wenn Sie eine Zeichenfolge, die einen erweiterten Namen enthält, an LINQ to XML übergeben, muss LINQ to XML den Namen analysieren und nach dem atomisierten Namespace und dem atomisierten Namen suchen. Dieser Prozess nimmt CPU-Zeit in Anspruch. Wenn es auf eine hohe Leistung ankommt, sollten Sie daher explizit ein <xref:System.Xml.Linq.XNamespace>-Objekt deklarieren und verwenden.

Wenn die Leistung ein wichtiger Aspekt ist, finden Sie weitere Informationen unter Pre-Atomization of XName Objects (LINQ to XML) (C#) (Voratomisierung von XName-Objekten (LINQ to XML) (C#)).

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

Dieses Beispiel erzeugt die folgende Ausgabe:

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

Siehe auch

Working with XML Namespaces (C#) (Arbeiten mit XML-Namespaces (C#))