Delen via


XML-structuren maken in C# (LINQ naar XML)

Dit artikel bevat informatie over het maken van XML-structuren in C#.

Zie Functionele constructie voor informatie over het gebruik van de resultaten van LINQ-query's als de inhoud voor een.XElement

Elementen samenstellen

Met de handtekeningen van de XElement en XAttribute constructors kunt u de inhoud van het element of kenmerk doorgeven als argumenten aan de constructor. Omdat een van de constructors een variabel aantal argumenten gebruikt, kunt u een willekeurig aantal onderliggende elementen doorgeven. Natuurlijk kan elk van deze onderliggende elementen hun eigen onderliggende elementen bevatten. Voor elk element kunt u een willekeurig aantal kenmerken toevoegen.

Wanneer u (inclusiefXElement) of XAttribute objecten toevoegt XNode , worden de objecten gewoon gekoppeld aan de XML-structuur als de nieuwe inhoud geen bovenliggende inhoud heeft. Als de nieuwe inhoud al bovenliggend is en deel uitmaakt van een andere XML-structuur, wordt de nieuwe inhoud gekloond en wordt de zojuist gekloonde inhoud gekoppeld aan de XML-structuur. In het laatste voorbeeld in dit artikel ziet u dit.

Als u een contacts XElementwilt maken, kunt u de volgende code gebruiken:

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

Als deze juist is ingesprongen, lijkt de code om objecten te maken XElement nauw op de structuur van de onderliggende XML.

XElement-constructors

De XElement klasse maakt gebruik van de volgende constructors voor functionele constructie. Houd er rekening mee dat er enkele andere constructors voor XElementzijn, maar omdat ze niet worden gebruikt voor functionele constructie, worden ze hier niet vermeld.

Constructor Beschrijving
XElement(XName name, object content) Hiermee maakt u een XElement. De name parameter geeft de naam van het element op. content Hiermee geeft u de inhoud van het element op.
XElement(XName name) Hiermee maakt u een XElement met XName de geïnitialiseerde naam naar de opgegeven naam.
XElement(XName name, params object[] content) Hiermee maakt u een XElement met XName de geïnitialiseerde naam naar de opgegeven naam. De kenmerken en/of onderliggende elementen worden gemaakt op basis van de inhoud van de parameterlijst.

De content parameter is uiterst flexibel. Het ondersteunt elk type object dat een geldig onderliggend element van een XElement. De volgende regels zijn van toepassing op verschillende typen objecten die in deze parameter worden doorgegeven:

  • Er wordt een tekenreeks toegevoegd als tekstinhoud.
  • Een XElement wordt toegevoegd als een onderliggend element.
  • Een XAttribute wordt toegevoegd als een kenmerk.
  • Een XProcessingInstruction, XCommentof XText wordt toegevoegd als onderliggende inhoud.
  • Een IEnumerable wordt opgesomd en deze regels worden recursief toegepast op de resultaten.
  • Voor elk ander type ToString wordt de methode aangeroepen en wordt het resultaat toegevoegd als tekstinhoud.

Voorbeeld: Een XElement maken met inhoud

U kunt een XElement met eenvoudige inhoud maken met één methodeaanroep. Hiertoe geeft u de inhoud op als de tweede parameter, als volgt:

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

In dit voorbeeld wordt de volgende uitvoer gegenereerd:

<Customer>Adventure Works</Customer>

U kunt elk type object doorgeven als de inhoud. Met de volgende code wordt bijvoorbeeld een element gemaakt dat een drijvendekommagetal als inhoud bevat:

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

In dit voorbeeld wordt de volgende uitvoer gegenereerd:

<Cost>324.5</Cost>

Het drijvendekommagetal wordt in het vak geplaatst en doorgegeven aan de constructor. Het vakkennummer wordt geconverteerd naar een tekenreeks en wordt gebruikt als de inhoud van het element.

Voorbeeld: Een XElement maken met een onderliggend element

Als u een exemplaar van de XElement klasse doorgeeft voor het inhoudsargument, maakt de constructor een element met een onderliggend element:

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

In dit voorbeeld wordt de volgende uitvoer gegenereerd:

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

Voorbeeld: Een XElement met meerdere onderliggende elementen maken

U kunt een aantal XElement objecten voor de inhoud doorgeven. Elk van de XElement objecten is opgenomen als een onderliggend 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);

In dit voorbeeld wordt de volgende uitvoer gegenereerd:

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

Door het vorige voorbeeld uit te breiden, kunt u als volgt een volledige XML-structuur maken:

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

In dit voorbeeld wordt de volgende uitvoer gegenereerd:

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

Voorbeeld: Een XElement maken met een XAttribute

Als u een exemplaar van de XAttribute klasse voor het inhoudsargument doorgeeft, maakt de constructor een element met een kenmerk:

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

In dit voorbeeld wordt de volgende uitvoer gegenereerd:

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

Voorbeeld: Een leeg element maken

Als u een leeg XElementbestand wilt maken, geeft u geen inhoud door aan de constructor. In het volgende voorbeeld wordt een leeg element gemaakt:

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

In dit voorbeeld wordt de volgende uitvoer gegenereerd:

<Customer />

Voorbeeld: Koppelen versus klonen

Zoals eerder vermeld, worden de objecten bij het toevoegen XNode (inclusief XElement) of XAttribute objecten, als de nieuwe inhoud geen bovenliggende inhoud heeft, gewoon gekoppeld aan de XML-structuur. Als de nieuwe inhoud al bovenliggend is en deel uitmaakt van een andere XML-structuur, wordt de nieuwe inhoud gekloond en wordt de zojuist gekloonde inhoud gekoppeld aan de XML-structuur.

In het volgende voorbeeld ziet u het gedrag wanneer u een bovenliggend element aan een boomstructuur toevoegt en wanneer u een element zonder bovenliggende element aan een boomstructuur toevoegt:

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

Zie ook