Erstellen von XML-Strukturen in C# (LINQ to XML)Creating XML Trees in C# (LINQ to XML)

Dieser Abschnitt enthält Informationen zum Erstellen von XML-Strukturen in C#.This section provides information about creating XML trees 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#).For information about using the results of LINQ queries as the content for an XElement, see Functional Construction (LINQ to XML) (C#).

Konstruieren von ElementenConstructing Elements

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.The signatures of the XElement and XAttribute constructors let you pass the contents of the element or attribute as arguments to the constructor. Da einer der Konstruktoren eine variable Anzahl von Argumenten akzeptiert, können Sie jede beliebige Anzahl von untergeordneten Elementen übergeben.Because one of the constructors takes a variable number of arguments, you can pass any number of child elements. Natürlich kann jedes dieser untergeordneten Elemente wiederum untergeordnete Elemente enthalten.Of course, each of those child elements can contain their own child elements. Für jedes Element können Sie eine beliebige Anzahl von Attributen hinzufügen.For any element, you can add any number of attributes.

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.When adding XNode (including XElement) or XAttribute objects, if the new content has no parent, the objects are simply attached to the XML tree. 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.If the new content already is parented, and is part of another XML tree, the new content is cloned, and the newly cloned content is attached to the XML tree. Dies wird im letzten Beispiel in diesem Thema gezeigt.The last example in this topic demonstrates this.

Zum Erstellen eines contacts-XElement-Objekts können Sie den folgenden Code verwenden:To create a contactsXElement, you could use the following code:

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.If indented properly, the code to construct XElement objects closely resembles the structure of the underlying XML.

"XElement"-KonstruktorenXElement Constructors

Die XElement-Klasse verwendet für die funktionale Konstruktion die folgenden Konstruktoren.The XElement class uses the following constructors for functional construction. 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.Note that there are some other constructors for XElement, but because they are not used for functional construction they are not listed here.

KonstruktorConstructor BeschreibungDescription
XElement(XName name, object content) Erstellt ein XElement.Creates an XElement. Der name-Parameter gibt den Namen des Elements an, und content gibt den Inhalt des Elements an.The name parameter specifies the name of the element; content specifies the content of the element.
XElement(XName name) Erstellt ein XElement mit seinem XName, initialisiert für den angegebenen Namen.Creates an XElement with its XName initialized to the specified name.
XElement(XName name, params object[] content) Erstellt ein XElement mit seinem XName, initialisiert für den angegebenen Namen.Creates an XElement with its XName initialized to the specified name. Die Attribute und/oder untergeordneten Elemente werden aus dem Inhalt der Parameterliste erstellt.The attributes and/or child elements are created from the contents of the parameter list.

Der content-Parameter ist äußerst flexibel.The content parameter is extremely flexible. Er unterstützt jede Art von Objekt, das ein gültiges untergeordnetes Element eines XElement ist.It supports any type of object that is a valid child of an XElement. Die folgenden Regeln gelten für andere Arten von Objekten, die in diesem Parameter übergeben werden:The following rules apply to different types of objects passed in this parameter:

  • Eine Zeichenfolge wird als Textinhalt hinzugefügt.A string is added as text content.

  • Ein XElement wird als untergeordnetes Element hinzugefügt.An XElement is added as a child element.

  • Ein XAttribute wird als Attribut hinzugefügt.An XAttribute is added as an attribute.

  • Eine XProcessingInstruction, ein XComment oder ein XText wird als untergeordneter Inhalt hinzugefügt.An XProcessingInstruction, XComment, or XText is added as child content.

  • Eine IEnumerable wird aufgelistet, und diese Regeln werden rekursiv auf die Ergebnisse angewendet.An IEnumerable is enumerated, and these rules are applied recursively to the results.

  • Für alle anderen Arten wird deren ToString-Methode aufgerufen, und das Ergebnis wird als Textinhalt hinzugefügt.For any other type, its ToString method is called and the result is added as text content.

Erstellen eines "XElement" mit InhaltCreating an XElement with Content

Sie können mit einem einzigen Methodenaufruf ein XElement erstellen, das einfachen Inhalt enthält.You can create an XElement that contains simple content with a single method call. Geben Sie dazu den Inhalt wie folgt als zweiten Parameter an:To do this, specify the content as the second parameter, as follows:

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

Dieses Beispiel erzeugt die folgende Ausgabe:This example produces the following output:

<Customer>Adventure Works</Customer>  

Sie können jede Art von Objekt als Inhalt übergeben.You can pass any type of object as the content. So erstellt z. B. der folgende Code ein Element, das eine Gleitkommazahl als Inhalt enthält:For example, the following code creates an element that contains a floating point number as content:

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

Dieses Beispiel erzeugt die folgende Ausgabe:This example produces the following output:

<Cost>324.5</Cost>  

Die Gleitkommazahl wird geschachtelt und an den Konstruktor übergeben.The floating point number is boxed and passed in to the constructor. Die geschachtelte Zahl wird in eine Zeichenfolge konvertiert und als Inhalt des Elements verwendet.The boxed number is converted to a string and used as the content of the element.

Erstellen eines "XElement" mit einem untergeordneten ElementCreating an XElement with a Child Element

Wenn Sie eine Instanz der XElement-Klasse für das Inhaltsargument übergeben, erstellt der Konstruktor ein Element mit einem untergeordneten Element:If you pass an instance of the XElement class for the content argument, the constructor creates an element with a child element:

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

Dieses Beispiel erzeugt die folgende Ausgabe:This example produces the following output:

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

Erstellen eines "XElement" mit mehreren untergeordneten ElementenCreating an XElement with Multiple Child Elements

Sie können für den Inhalt mehrere XElement-Objekte übergeben.You can pass in a number of XElement objects for the content. Jedes dieser XElement-Objekte wird zu einem untergeordneten Element.Each of the XElement objects is included as a child 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:This example produces the following output:

<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:By extending the above example, you can create an entire XML tree, as follows:

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:This example produces the following output:

<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 ElementsCreating an Empty Element

Wenn Sie ein leeres XElement erstellen möchten, übergeben Sie einfach keinen Inhalt an den Konstruktor.To create an empty XElement, you do not pass any content to the constructor. Das folgende Beispiel erstellt ein leeres Element:The following example creates an empty element:

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

Dieses Beispiel erzeugt die folgende Ausgabe:This example produces the following output:

<Customer />  

Anfügen oder Klonen?Attaching vs. Cloning

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.As mentioned previously, when adding XNode (including XElement) or XAttribute objects, if the new content has no parent, the objects are simply attached to the XML tree. 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.If the new content already is parented and is part of another XML tree, the new content is cloned, and the newly cloned content is attached to the XML tree.

// 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:This example produces the following output:

Child1 was cloned  
Child2 was attached  

Siehe auchSee Also

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