Dela via


Skapa XML-träd i C# (LINQ till XML)

Den här artikeln innehåller information om hur du skapar XML-träd i C#.

Information om hur du använder resultatet av LINQ-frågor som innehåll för en XElementfinns i Funktionell konstruktion.

Skapa element

Med signaturer för XElement konstruktorerna och XAttribute kan du skicka innehållet i elementet eller attributet som argument till konstruktorn. Eftersom en av konstruktörerna tar ett variabelt antal argument kan du skicka valfritt antal underordnade element. Naturligtvis kan vart och ett av dessa underordnade element innehålla sina egna underordnade element. För alla element kan du lägga till valfritt antal attribut.

När du lägger till XNode (inklusive XElement) eller XAttribute objekt, om det nya innehållet inte har någon överordnad, kopplas objekten helt enkelt till XML-trädet. Om det nya innehållet redan är överordnat och ingår i ett annat XML-träd klonas det nya innehållet och det nyligen klonade innehållet är kopplat till XML-trädet. Det sista exemplet i den här artikeln visar detta.

Om du vill skapa en contacts XElementkan du använda följande kod:

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")
            )
        )
    );

Om den är korrekt indragen liknar koden för att konstruera XElement objekt den underliggande XML-strukturen.

XElement-konstruktorer

Klassen XElement använder följande konstruktorer för funktionell konstruktion. Observera att det finns några andra konstruktorer för XElement, men eftersom de inte används för funktionell konstruktion visas de inte här.

Konstruktor beskrivning
XElement(XName name, object content) Skapar en XElement. Parametern name anger namnet på elementet. content Anger elementets innehåll.
XElement(XName name) Skapar en XElement med dess XName initierade till det angivna namnet.
XElement(XName name, params object[] content) Skapar en XElement med dess XName initierade till det angivna namnet. Attributen och/eller underordnade element skapas från innehållet i parameterlistan.

Parametern content är extremt flexibel. Den stöder alla typer av objekt som är ett giltigt underordnat objekt till en XElement. Följande regler gäller för olika typer av objekt som skickas i den här parametern:

  • En sträng läggs till som textinnehåll.
  • En XElement läggs till som ett underordnat element.
  • En XAttribute läggs till som ett attribut.
  • Ett XProcessingInstruction, XComment, eller XText läggs till som underordnat innehåll.
  • En IEnumerable räknas upp och dessa regler tillämpas rekursivt på resultaten.
  • För andra typer anropas dess ToString metod och resultatet läggs till som textinnehåll.

Exempel: Skapa ett XElement med innehåll

Du kan skapa ett XElement som innehåller enkelt innehåll med ett enda metodanrop. Det gör du genom att ange innehållet som den andra parametern enligt följande:

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

Det här exemplet genererar följande utdata:

<Customer>Adventure Works</Customer>

Du kan skicka alla typer av objekt som innehåll. Följande kod skapar till exempel ett element som innehåller ett flyttalsnummer som innehåll:

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

Det här exemplet genererar följande utdata:

<Cost>324.5</Cost>

Flyttalsnumret boxas och skickas till konstruktorn. Det boxade talet konverteras till en sträng och används som elementinnehåll.

Exempel: Skapa ett XElement med ett underordnat element

Om du skickar en instans av XElement klassen för innehållsargumentet skapar konstruktorn ett element med ett underordnat element:

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

Det här exemplet genererar följande utdata:

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

Exempel: Skapa ett XElement med flera underordnade element

Du kan skicka in ett antal XElement objekt för innehållet. Vart och ett av objekten ingår som ett underordnat XElement 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);

Det här exemplet genererar följande utdata:

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

Genom att utöka föregående exempel kan du skapa ett helt XML-träd på följande sätt:

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);

Det här exemplet genererar följande utdata:

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

Exempel: Skapa ett XElement med en XAttribute

Om du skickar en instans av XAttribute klassen för innehållsargumentet skapar konstruktorn ett element med ett attribut:

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

Det här exemplet genererar följande utdata:

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

Exempel: Skapa ett tomt element

Om du vill skapa en tom XElementskickar du inget innehåll till konstruktorn. I följande exempel skapas ett tomt element:

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

Det här exemplet genererar följande utdata:

<Customer />

Exempel: Koppla jämfört med klon

Som tidigare nämnts, när du lägger till XNode (inklusive XElement) eller XAttribute objekt, om det nya innehållet inte har någon överordnad, är objekten helt enkelt kopplade till XML-trädet. Om det nya innehållet redan är överordnat och ingår i ett annat XML-träd klonas det nya innehållet och det nyligen klonade innehållet är kopplat till XML-trädet.

I följande exempel visas beteendet när du lägger till ett överordnat element i ett träd och när du lägger till ett element utan överordnad i ett träd:

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

Se även