Vorgehensweise: Transformieren der Form eines XML-Baums (C#)How to: Transform the Shape of an XML Tree (C#)

Die Form eines XML-Dokuments wird von dessen Elementnamen, Attributnamen und den Merkmalen seiner Hierarchie bestimmt.The shape of an XML document refers to its element names, attribute names, and the characteristics of its hierarchy.

Es kann passieren, dass Sie die Form eines XML-Dokuments ändern müssen.Sometimes you will have to change the shape of an XML document. Dies kann z. B. der Fall sein, wenn Sie ein vorhandenes XML-Dokument an ein anderes System senden müssen, das andere Element- und Attributnamen verlangt.For example, you might have to send an existing XML document to another system that requires different element and attribute names. Sie können das Dokument zwar selbst durchgehen und die Elemente nach Bedarf löschen und umbenennen, bei Verwendung der funktionalen Konstruktion erhalten Sie aber besser lesbaren und verwaltbaren Code.You could go through the document, deleting and renaming elements as required, but using functional construction results in more readable and maintainable code. Weitere Informationen zu funktionalen Konstruktionen finden Sie unter Functional Construction (LINQ to XML) (C#) (Funktionale Konstruktion (LINQ to XML) (C#)).For more information about functional construction, see Functional Construction (LINQ to XML) (C#).

Das erste Beispiel ändert die Organisation des XML-Dokuments.The first example changes the organization of the XML document. Dabei werden komplexe Elemente von einer Position in der Struktur an eine andere verschoben.It moves complex elements from one location in the tree to another.

Das zweite Beispiel in diesem Thema erstellt ein XML-Dokument, dessen Form sich von der Form des Quelldokuments unterscheidet.The second example in this topic creates an XML document with a different shape than the source document. Es ändert die Groß- und Kleinschreibung der Elementnamen, benennt einige Elemente um und lässt einige Elemente aus der Quellstruktur aus der transformierten Struktur heraus.It changes the casing of the element names, renames some elements, and leaves some elements from the source tree out of the transformed tree.

BeispielExample

Der folgende Code ändert die Form einer XML-Datei, die eingebettete Abfrageausdrücke verwendet.The following code changes the shape of an XML file using embedded query expressions.

Das XML-Quelldokument in diesem Beispiel enthält unter dem Customers-Element ein Root-Element, das alle Kunden enthält.The source XML document in this example contains a Customers element under the Root element that contains all customers. Außerdem enthält es unter dem Orders-Element ein Root-Element, das alle Aufträge enthält.It also contains an Orders element under the Root element that contains all orders. Dieses Beispiel erstellt eine neue XML-Struktur, in der die Aufträge der einzelnen Kunden in einem Orders-Element innerhalb des Customer-Elements enthalten sind.This example creates a new XML tree in which the orders for each customer are contained in an Orders element within the Customer element. Das Originaldokument enthält auch ein CustomerID-Element im Order-Element; dieses Element wird aus dem neu geformten Dokument entfernt.The original document also contains a CustomerID element in the Order element; this element will be removed from the re-shaped document.

In diesem Beispiel wird das folgende XML-Dokument verwendet: Beispiel-XML-Datei: Kunden und Bestellungen (LINQ to XML).This example uses the following XML document: Sample XML File: Customers and Orders (LINQ to XML).

XElement co = XElement.Load("CustomersOrders.xml");  
XElement newCustOrd =  
    new XElement("Root",  
        from cust in co.Element("Customers").Elements("Customer")  
        select new XElement("Customer",  
            cust.Attributes(),  
            cust.Elements(),  
            new XElement("Orders",  
                from ord in co.Element("Orders").Elements("Order")  
                where (string)ord.Element("CustomerID") == (string)cust.Attribute("CustomerID")  
                select new XElement("Order",  
                    ord.Attributes(),  
                    ord.Element("EmployeeID"),  
                    ord.Element("OrderDate"),  
                    ord.Element("RequiredDate"),  
                    ord.Element("ShipInfo")  
                )  
            )  
        )  
    );  
Console.WriteLine(newCustOrd);  

Dieser Code erzeugt die folgende Ausgabe:This code produces the following output:

<Root>  
  <Customer CustomerID="GREAL">  
    <CompanyName>Great Lakes Food Market</CompanyName>  
    <ContactName>Howard Snyder</ContactName>  
    <ContactTitle>Marketing Manager</ContactTitle>  
    <Phone>(503) 555-7555</Phone>  
    <FullAddress>  
      <Address>2732 Baker Blvd.</Address>  
      <City>Eugene</City>  
      <Region>OR</Region>  
      <PostalCode>97403</PostalCode>  
      <Country>USA</Country>  
    </FullAddress>  
    <Orders />  
  </Customer>  
  <Customer CustomerID="HUNGC">  
    <CompanyName>Hungry Coyote Import Store</CompanyName>  
    <ContactName>Yoshi Latimer</ContactName>  
    <ContactTitle>Sales Representative</ContactTitle>  
    <Phone>(503) 555-6874</Phone>  
    <Fax>(503) 555-2376</Fax>  
    <FullAddress>  
      <Address>City Center Plaza 516 Main St.</Address>  
      <City>Elgin</City>  
      <Region>OR</Region>  
      <PostalCode>97827</PostalCode>  
      <Country>USA</Country>  
    </FullAddress>  
    <Orders />  
  </Customer>  
  . . .  

BeispielExample

Dieses Beispiel benennt einige Elemente um und wandelt einige Attribute in Elemente um.This example renames some elements and converts some attributes to elements.

Der Code ruft ConvertAddress auf, wodurch eine Liste von XElement-Objekten zurückgegeben wird.The code calls ConvertAddress, which returns a list of XElement objects. Das Argument für die Methode ist eine Abfrage, die das komplexe Address-Element bestimmt, wobei das Type-Attribut den Wert "Shipping" hat.The argument to the method is a query that determines the Address complex element where the Type attribute has a value of "Shipping".

Dieses Beispiel verwendet das folgende XML-Dokument: Beispiel-XML-Datei: Typische Bestellung (LINQ to XML).This example uses the following XML document: Sample XML File: Typical Purchase Order (LINQ to XML).

static IEnumerable<XElement> ConvertAddress(XElement add)  
{  
    List<XElement> fragment = new List<XElement>() {  
        new XElement("NAME", (string)add.Element("Name")),  
        new XElement("STREET", (string)add.Element("Street")),  
        new XElement("CITY", (string)add.Element("City")),  
        new XElement("ST", (string)add.Element("State")),  
        new XElement("POSTALCODE", (string)add.Element("Zip")),  
        new XElement("COUNTRY", (string)add.Element("Country"))  
    };  
    return fragment;  
}  

static void Main(string[] args)  
{  
    XElement po = XElement.Load("PurchaseOrder.xml");  
    XElement newPo = new XElement("PO",  
        new XElement("ID", (string)po.Attribute("PurchaseOrderNumber")),  
        new XElement("DATE", (DateTime)po.Attribute("OrderDate")),  
        ConvertAddress(  
            (from el in po.Elements("Address")  
            where (string)el.Attribute("Type") == "Shipping"  
            select el)  
            .First()  
        )  
    );  
    Console.WriteLine(newPo);  
}  

Dieser Code erzeugt die folgende Ausgabe:This code produces the following output:

<PO>  
  <ID>99503</ID>  
  <DATE>1999-10-20T00:00:00</DATE>  
  <NAME>Ellen Adams</NAME>  
  <STREET>123 Maple Street</STREET>  
  <CITY>Mill Valley</CITY>  
  <ST>CA</ST>  
  <POSTALCODE>10999</POSTALCODE>  
  <COUNTRY>USA</COUNTRY>  
</PO>  

Siehe auchSee Also

Projektionen und Transformationen (LINQ to XML) (C#)Projections and Transformations (LINQ to XML) (C#)