Gewusst wie: Erstellen eines Dokuments mit Namespaces (C#) (LINQ to XML)
Aktualisiert: November 2007
In diesem Thema wird das Erstellen von Dokumenten mit Namespaces beschrieben.
Beispiel
Um ein Element oder Attribut in einem Namespace zu erstellen, deklarieren und initialisieren Sie zunächst ein XNamespace-Objekt. Anschließend verbinden Sie mithilfe der Additionsoperatorüberladung den Namespace mit dem lokalen Namen, ausgedrückt als Zeichenfolge.
Das folgende Beispiel erstellt ein Dokument mit einem (1) Namespace. In der Standardeinstellung serialisiert LINQ to XML dieses Dokument mit einem Standardnamespace.
// 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);
Dieses Beispiel führt zur folgenden Ausgabe:
<Root xmlns="https://www.adventure-works.com">
<Child>child content</Child>
</Root>
Das folgende Beispiel erstellt ein Dokument mit nur einem Namespace. Es erstellt auch ein Attribut, das den Namespace mit einem Namespacepräfix deklariert. Beim Erstellen eines Attributs, das einen Namespace mit einem Präfix deklariert, erstellen Sie ein Attribut, bei dem der Name des Attributs das Namespacepräfix ist und sich dieser Name im Xmlns-Namespace befindet. Dieser Attributwert ist der URI des Namespaces.
// 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);
Dieses Beispiel führt zur folgenden Ausgabe:
<aw:Root xmlns:aw="https://www.adventure-works.com">
<aw:Child>child content</aw:Child>
</aw:Root>
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 https://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 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);
Dieses Beispiel führt zur folgenden Ausgabe:
<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>
Das folgende Beispiel erstellt ein Dokument, das zwei Namespaces enthält, die beide über ein Namespacepräfix verfügen.
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);
Dieses Beispiel führt zur folgenden Ausgabe:
<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>
Dasselbe Ergebnis lässt sich erzielen, indem nicht ein XNamespace-Objekt deklariert und erstellt wird, sondern erweiterte Namen verwendet werden.
Dieser Ansatz wirkt sich aber negativ auf die Leistung aus. Jedes Mal, wenn Sie eine Zeichenfolge mit erweitertem Namen 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. Die Leistung kann gesteigert werden, wenn ein XNamespace-Objekt explizit deklariert und verwendet wird.
Weitere Informationen zur Leistung finden Sie unter Voratomisierung von XName-Objekten (LINQ to XML).
// 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);
Dieses Beispiel führt zur folgenden Ausgabe:
<aw:Root xmlns:aw="https://www.adventure-works.com">
<aw:Child>child content</aw:Child>
</aw:Root>