Erstellen von XML-Strukturen in C# (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 (LINQ to XML) (C#).

Konstruieren von Elementen

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.

Beim Hinzufügen von XNode- (einschließlich XElement) oder XAttribute-Objekten werden Objekte einfach an die XML-Struktur angefügt, wenn der neue Inhalt kein übergeordnetes Element besitzt. 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.

Um eine contactsXElement zu erstellen, können Sie 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 deren XName-Klasse, die mit dem angegebenen Namen initialisiert wird.
XElement(XName name, params object[] content) Erstellt ein XElement mit deren XName-Klasse, die mit dem angegebenen Namen initialisiert wird. Die Attribute und/oder untergeordneten Elemente werden aus dem Inhalt der Parameterliste erstellt.

Der content-Parameter ist äußerst flexibel. Er unterstützt jede Art von Objekt, das ein gültiges untergeordnetes Element eines 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.

  • Eine XElement-Klasse wird als untergeordnetes Element hinzugefügt.

  • Eine XAttribute-Klasse wird als Attribut hinzugefügt.

  • Eine XProcessingInstruction-, XComment- oder XText-Klasse wird als untergeordneter Inhalt hinzugefügt.

  • Eine IEnumerable-Schnittstelle wird aufgezählt, und diese Regeln werden rekursiv den Ergebnissen hinzugefügt.

  • Für alle anderen Arten wird deren ToString-Methode aufgerufen, und das Ergebnis wird als Textinhalt hinzugefügt.

Erstellen eines "XElement" mit Inhalt

Sie können mit einem einzigen Methodenaufruf eine XElement-Klasse erstellen, die 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.

Erstellen eines "XElement" mit einem untergeordneten Element

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>  

Erstellen eines "XElement" mit mehreren untergeordneten Elementen

Sie können eine Anzahl von XElement-Objekten für den Inhalt übergeben. Jedes der XElement-Objekte ist als untergeordnetes Element eingeschlossen.

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

Erstellen eines leeren Elements

Wenn Sie eine leere XElement-Klasse erstellen möchten, übergeben Sie einfach 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 />  

Anfügen oder Klonen?

Beim Hinzufügen von XNode- (einschließlich XElement) oder XAttribute-Objekten zu einer neuen Struktur werden – wie zuvor erwähnt – die Objekte einfach an die XML-Struktur angefügt, wenn der neue Inhalt kein übergeordnetes Element besitzt. 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.

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

// Create an element that is 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");  

Dieses Beispiel erzeugt die folgende Ausgabe:

Child1 was cloned  
Child2 was attached  

Siehe auch

Creating XML Trees (C#) (Erstellen von XML-Strukturen (C#))