XML-Strukturen in C# erstellen (LINQ to XML)

Dieser Abschnitt enthält Informationen zum Erstellen von XML-Strukturen in C#.

Informationen zur Verwendung der Ergebnisse von LINQ-Abfragen als Inhalt für eine XElement-Klasse finden Sie unter Funktionale Konstruktion.

Elemente erstellen

Die Signaturen der XElement-Konstruktoren und der XAttribute-Konstruktoren ermöglichen es Ihnen, den Inhalt des Elements oder Attributs als Argumente an den Konstruktor zu übergeben. Da einer der Konstruktoren eine variable Anzahl von Argumenten akzeptiert, können Sie jede beliebige Anzahl von untergeordneten Elementen übergeben. Natürlich kann jedes dieser untergeordneten Elemente wiederum untergeordnete Elemente enthalten. Für jedes Element können Sie eine beliebige Anzahl von Attributen hinzufügen.

Wenn beim Hinzufügen von XNode-Objekten (einschließlich XElement) oder von XAttribute-Objekten der neue Inhalt kein übergeordnetes Element besitzt, werden die Objekte einfach an die XML-Struktur angefügt. Wenn der neue Inhalt bereits ein übergeordnetes Element besitzt und Bestandteil einer anderen XML-Struktur ist, wird er geklont, und der neu geklonte Inhalt wird an die XML-Struktur angefügt. Dies wird im letzten Beispiel in diesem Thema gezeigt.

Zum Erstellen eines contacts-XElement-Objekts können Sie den folgenden Code verwenden:

XElement contacts =
    new XElement("Contacts",
        new XElement("Contact",
            new XElement("Name", "Patrick Hines"),
            new XElement("Phone", "206-555-0144"),
            new XElement("Address",
                new XElement("Street1", "123 Main St"),
                new XElement("City", "Mercer Island"),
                new XElement("State", "WA"),
                new XElement("Postal", "68042")
            )
        )
    );

Bei ordnungsgemäßen Einzügen ähnelt der zum Konstruieren von XElement-Objekten verwendete Code sehr stark der Struktur des zugrunde liegenden XML-Codes.

„XElement“-Konstruktoren

Die XElement-Klasse verwendet für die funktionale Konstruktion die folgenden Konstruktoren. Beachten Sie, dass es auch noch andere Konstruktoren für XElement gibt. Diese werden nicht für die funktionale Konstruktion verwendet und sind daher hier auch nicht aufgeführt.

Konstruktor BESCHREIBUNG
XElement(XName name, object content) Erstellt ein XElement. Der name-Parameter gibt den Namen des Elements an, und content gibt den Inhalt des Elements an.
XElement(XName name) Erstellt ein XElement mit seinem XName, initialisiert für den angegebenen Namen.
XElement(XName name, params object[] content) Erstellt ein XElement mit seinem XName, initialisiert für den angegebenen Namen. Die Attribute und/oder untergeordneten Elemente werden aus dem Inhalt der Parameterliste erstellt.

Der content-Parameter ist äußerst flexibel. Es wird jedwede Art von Objekt unterstützt, die ein gültiges untergeordnetes Element von XElement ist. Die folgenden Regeln gelten für andere Arten von Objekten, die in diesem Parameter übergeben werden:

  • Eine Zeichenfolge wird als Textinhalt hinzugefügt.
  • Ein XElement wird als untergeordnetes Element hinzugefügt.
  • Ein XAttribute wird als Attribut hinzugefügt.
  • Eine XProcessingInstruction, ein XComment oder ein XText wird als untergeordneter Inhalt hinzugefügt.
  • Eine IEnumerable wird aufgelistet, und diese Regeln werden rekursiv auf die Ergebnisse angewendet.
  • Für alle anderen Arten wird deren ToString-Methode aufgerufen, und das Ergebnis wird als Textinhalt hinzugefügt.

Beispiel: XElement mit Inhalt erstellen

Sie können mit einem einzigen Methodenaufruf ein XElement erstellen, das einfachen Inhalt enthält. Geben Sie dazu den Inhalt wie folgt als zweiten Parameter an:

XElement n = new XElement("Customer", "Adventure Works");
Console.WriteLine(n);

Dieses Beispiel erzeugt die folgende Ausgabe:

<Customer>Adventure Works</Customer>

Sie können jede Art von Objekt als Inhalt übergeben. So erstellt z. B. der folgende Code ein Element, das eine Gleitkommazahl als Inhalt enthält:

XElement n = new XElement("Cost", 324.50);
Console.WriteLine(n);

Dieses Beispiel erzeugt die folgende Ausgabe:

<Cost>324.5</Cost>

Die Gleitkommazahl wird geschachtelt und an den Konstruktor übergeben. Die geschachtelte Zahl wird in eine Zeichenfolge konvertiert und als Inhalt des Elements verwendet.

Beispiel: XElement mit einem untergeordneten Element erstellen

Wenn Sie eine Instanz der XElement-Klasse für das Inhaltsargument übergeben, erstellt der Konstruktor ein Element mit einem untergeordneten Element:

XElement shippingUnit = new XElement("ShippingUnit",
    new XElement("Cost", 324.50)
);
Console.WriteLine(shippingUnit);

Dieses Beispiel erzeugt die folgende Ausgabe:

<ShippingUnit>
  <Cost>324.5</Cost>
</ShippingUnit>

Beispiel: XElement mit mehreren untergeordneten Elementen erstellen

Sie können für den Inhalt mehrere XElement-Objekte übergeben. Jedes dieser XElement-Objekte wird zu einem untergeordneten Element.

XElement address = new XElement("Address",
    new XElement("Street1", "123 Main St"),
    new XElement("City", "Mercer Island"),
    new XElement("State", "WA"),
    new XElement("Postal", "68042")
);
Console.WriteLine(address);

Dieses Beispiel erzeugt die folgende Ausgabe:

<Address>
  <Street1>123 Main St</Street1>
  <City>Mercer Island</City>
  <State>WA</State>
  <Postal>68042</Postal>
</Address>

Sie können eine gesamte XML-Struktur erstellen, indem Sie das oben erwähnte Beispiel wie folgt erweitern:

XElement contacts =
    new XElement("Contacts",
        new XElement("Contact",
            new XElement("Name", "Patrick Hines"),
            new XElement("Phone", "206-555-0144"),
            new XElement("Address",
                new XElement("Street1", "123 Main St"),
                new XElement("City", "Mercer Island"),
                new XElement("State", "WA"),
                new XElement("Postal", "68042")
            )
        )
    );
Console.WriteLine(contacts);

Dieses Beispiel erzeugt die folgende Ausgabe:

<Contacts>
  <Contact>
    <Name>Patrick Hines</Name>
    <Phone>206-555-0144</Phone>
    <Address>
      <Street1>123 Main St</Street1>
      <City>Mercer Island</City>
      <State>WA</State>
      <Postal>68042</Postal>
    </Address>
  </Contact>
</Contacts>

Beispiel: XElement mit einem XAttribute erstellen

Wenn Sie eine Instanz der XAttribute-Klasse für das Inhaltsargument übergeben, erstellt der Konstruktor ein Element mit einem Attribut:

XElement phone = new XElement("Phone",
    new XAttribute("Type", "Home"),
    "555-555-5555");
Console.WriteLine(phone);

Dieses Beispiel erzeugt die folgende Ausgabe:

<Phone Type="Home">555-555-5555</Phone>

Beispiel: Leeres Element erstellen

Wenn Sie ein leeres XElement erstellen möchten, übergeben Sie keinen Inhalt an den Konstruktor. Das folgende Beispiel erstellt ein leeres Element:

XElement n = new XElement("Customer");
Console.WriteLine(n);

Dieses Beispiel erzeugt die folgende Ausgabe:

<Customer />

Beispiel: Anfügen im Vergleich zum Klonen

Wie bereits erwähnt, werden beim Hinzufügen von XNode-Objekten (einschließlich XElement) oder von XAttribute-Objekten für den Fall, dass der neue Inhalt kein übergeordnetes Element besitzt, die Objekte einfach an die XML-Struktur angefügt. Wenn der neue Inhalt bereits ein übergeordnetes Element besitzt und Bestandteil einer anderen XML-Struktur ist, wird er geklont, und der neu geklonte Inhalt wird an die XML-Struktur angefügt.

Das folgende Beispiel zeigt das Verhalten, wenn Sie einer Struktur ein übergeordnetes Element und ein Element ohne übergeordnetes Element hinzufügen:

// Create a tree with a child element.
XElement xmlTree1 = new XElement("Root",
    new XElement("Child1", 1)
);

// Create an element that's not parented.
XElement child2 = new XElement("Child2", 2);

// Create a tree and add Child1 and Child2 to it.
XElement xmlTree2 = new XElement("Root",
    xmlTree1.Element("Child1"),
    child2
);

// Compare Child1 identity.
Console.WriteLine("Child1 was {0}",
    xmlTree1.Element("Child1") == xmlTree2.Element("Child1") ?
    "attached" : "cloned");

// Compare Child2 identity.
Console.WriteLine("Child2 was {0}",
    child2 == xmlTree2.Element("Child2") ?
    "attached" : "cloned");

// This example produces the following output:
//    Child1 was cloned
//    Child2 was attached

Siehe auch