XML-fák létrehozása C# nyelven (LINQ–XML)
Ez a cikk tájékoztatást nyújt az XML-fák C#-ban való létrehozásáról.
További információ a LINQ-lekérdezések eredményeinek tartalomként való XElementhasználatáról: Funkcionális szerkezet.
Elemek létrehozása
A konstruktorok és XAttribute a XElement konstruktorok aláírásával argumentumként továbbíthatja az elem vagy attribútum tartalmát a konstruktornak. Mivel az egyik konstruktor változó számú argumentumot vesz fel, tetszőleges számú gyermekelemet átadhat. Természetesen mindegyik gyermekelem tartalmazhat saját gyermekelemeket. Bármely elemhez tetszőleges számú attribútumot adhat hozzá.
Ha az új tartalom nem tartalmaz szülőt, az objektumok hozzáadásakor XNode (beleértve XElement) vagy XAttribute objektumokként egyszerűen az XML-fához lesznek csatolva. Ha az új tartalom már fölérendelt, és egy másik XML-fa része, a rendszer klónozza az új tartalmat, és az újonnan klónozott tartalmat csatolja az XML-fához. A cikk utolsó példája ezt mutatja be.
A következő kóddal hozhat létre egy contacts
XElementkódot:
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")
)
)
);
Ha megfelelően van behúzva, az objektumok létrehozására XElement szolgáló kód nagyon hasonlít a mögöttes XML szerkezetére.
XElement konstruktorok
Az XElement osztály az alábbi konstruktorokat használja a funkcionális építéshez. Vegye figyelembe, hogy vannak más konstruktorok is, XElementde mivel nem funkcionális építéshez használják őket, itt nem szerepelnek.
Konstruktor | Leírás |
---|---|
XElement(XName name, object content) |
Létrehoz egy XElement. A name paraméter az elem nevét adja meg; content az elem tartalmát adja meg. |
XElement(XName name) |
Létrehoz egy, XElement XName a megadott névre inicializált inicializálva. |
XElement(XName name, params object[] content) |
Létrehoz egy, XElement XName a megadott névre inicializált inicializálva. Az attribútumok és/vagy gyermekelemek a paraméterlista tartalmából jönnek létre. |
A content
paraméter rendkívül rugalmas. Bármilyen típusú objektumot támogat, amely egy adott objektum érvényes gyermeke XElement. Az alábbi szabályok az ebben a paraméterben átadott különböző típusú objektumokra vonatkoznak:
- A rendszer szöveges tartalomként egy sztringet ad hozzá.
- A XElement rendszer gyermekelemként hozzáad egy elemet.
- A XAttribute rendszer attribútumként hozzáad egy elemet.
- Egy XProcessingInstruction, XCommentvagy XText gyermektartalomként van hozzáadva.
- A IEnumerable rendszer számbavételt alkalmaz, és ezeket a szabályokat rekurzívan alkalmazza a rendszer az eredményekre.
- Bármilyen más típus esetén a metódus meghívása
ToString
és az eredmény szöveges tartalomként való hozzáadása.
Példa: XElement létrehozása tartalommal
Létrehozhat egy XElement egyszerű tartalmat egyetlen metódushívással. Ehhez adja meg a tartalmat második paraméterként az alábbiak szerint:
XElement n = new XElement("Customer", "Adventure Works");
Console.WriteLine(n);
Ez a példa a következő kimenetet hozza létre:
<Customer>Adventure Works</Customer>
Bármilyen típusú objektumot átadhat tartalomként. A következő kód például létrehoz egy elemet, amely egy lebegőpontos számot tartalmaz tartalomként:
XElement n = new XElement("Cost", 324.50);
Console.WriteLine(n);
Ez a példa a következő kimenetet hozza létre:
<Cost>324.5</Cost>
A lebegőpontos szám be van jelölve, és átadja a konstruktornak. A dobozos szám sztringgé alakul, és az elem tartalmaként használatos.
Példa: XElement létrehozása gyermekelemekkel
Ha a XElement tartalomargumentum osztálypéldányát adja át, a konstruktor létrehoz egy elemet egy gyermekelemmel:
XElement shippingUnit = new XElement("ShippingUnit",
new XElement("Cost", 324.50)
);
Console.WriteLine(shippingUnit);
Ez a példa a következő kimenetet hozza létre:
<ShippingUnit>
<Cost>324.5</Cost>
</ShippingUnit>
Példa: XElement létrehozása több gyermekelem használatával
A tartalomhoz több XElement objektumot is megadhat. XElement Mindegyik objektum gyermekelemként szerepel.
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);
Ez a példa a következő kimenetet hozza létre:
<Address>
<Street1>123 Main St</Street1>
<City>Mercer Island</City>
<State>WA</State>
<Postal>68042</Postal>
</Address>
Az előző példa kibővítésével létrehozhat egy teljes XML-fát az alábbiak szerint:
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);
Ez a példa a következő kimenetet hozza létre:
<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>
Példa: XElement létrehozása XAttribute használatával
Ha a XAttribute tartalomargumentum osztályának egy példányát adja át, a konstruktor létrehoz egy elemet egy attribútummal:
XElement phone = new XElement("Phone",
new XAttribute("Type", "Home"),
"555-555-5555");
Console.WriteLine(phone);
Ez a példa a következő kimenetet hozza létre:
<Phone Type="Home">555-555-5555</Phone>
Példa: Üres elem létrehozása
Üres XElementtartalom létrehozásához ne adjon át tartalmat a konstruktornak. A következő példa egy üres elemet hoz létre:
XElement n = new XElement("Customer");
Console.WriteLine(n);
Ez a példa a következő kimenetet hozza létre:
<Customer />
Példa: Csatolás és klónozás
Ahogy korábban említettük, ha hozzáad XNode (beleértve XElement) vagy XAttribute objektumokat, ha az új tartalomnak nincs szülője, az objektumok egyszerűen az XML-fához vannak csatolva. Ha az új tartalom már fölérendelt, és egy másik XML-fa része, az új tartalom klónozva lesz, és az újonnan klónozott tartalom az XML-fához van csatolva.
Az alábbi példa bemutatja, hogy milyen viselkedést mutat be, amikor szülőelemt ad hozzá egy fához, és ha szülő nélküli elemet ad hozzá egy fához:
// 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