Vytváření stromů XML v jazyce C# (LINQ to XML)
Tento článek obsahuje informace o vytváření stromů XML v jazyce C#.
Informace o použití výsledků dotazů LINQ jako obsahu pro funkci XElementnaleznete v tématu Funkční konstrukce.
Konstrukce elementů
Podpisy XElement a XAttribute konstruktory umožňují předat obsah elementu nebo atributu jako argumenty konstruktoru. Vzhledem k tomu, že jeden z konstruktorů přebírá proměnný počet argumentů, můžete předat libovolný počet podřízených prvků. Každý z těchto podřízených prvků může samozřejmě obsahovat vlastní podřízené prvky. Pro libovolný prvek můžete přidat libovolný počet atributů.
Při přidávání XNode (včetně XElement) nebo XAttribute objektů, pokud nový obsah nemá nadřazený, jsou objekty jednoduše připojeny ke stromu XML. Pokud je nový obsah již nadřazený a je součástí jiného stromu XML, nový obsah se naklonuje a nově naklonovaný obsah se připojí ke stromu XML. Poslední příklad v tomto článku to ukazuje.
K vytvoření contacts
XElementmůžete použít následující kód:
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")
)
)
);
Pokud je odsazení správně odsazeno, kód, který vytvoří XElement objekty, se podobá struktuře podkladového XML.
Konstruktory XElement
Třída XElement používá následující konstruktory pro funkční konstrukci. Všimněte si, že existují některé další konstruktory pro XElement, ale protože se nepoužívají pro funkční konstrukci, nejsou zde uvedeny.
Konstruktor | Popis |
---|---|
XElement(XName name, object content) |
Vytvoří .XElement Parametr name určuje název elementu; content určuje obsah elementu. |
XElement(XName name) |
Vytvoří s XElement inicializovaným XName názvem. |
XElement(XName name, params object[] content) |
Vytvoří s XElement inicializovaným XName názvem. Atributy a/nebo podřízené prvky se vytvářejí z obsahu seznamu parametrů. |
Parametr content
je extrémně flexibilní. Podporuje jakýkoli typ objektu, který je platným podřízeným objektem XElement. Následující pravidla platí pro různé typy objektů předaných v tomto parametru:
- Řetězec se přidá jako textový obsah.
- Přidá se XElement jako podřízený prvek.
- Přidá XAttribute se jako atribut.
- Položka XProcessingInstruction, XCommentnebo XText je přidána jako podřízený obsah.
- Vytvoří IEnumerable se výčet a tato pravidla se na výsledky aplikují rekurzivně.
- U jakéhokoli jiného typu se volá jeho
ToString
metoda a výsledek se přidá jako textový obsah.
Příklad: Vytvoření XElement s obsahem
Můžete vytvořit XElement , která obsahuje jednoduchý obsah s jedním voláním metody. Chcete-li to provést, zadejte obsah jako druhý parametr následujícím způsobem:
XElement n = new XElement("Customer", "Adventure Works");
Console.WriteLine(n);
Tento příklad vytvoří následující výstup:
<Customer>Adventure Works</Customer>
Jako obsah můžete předat libovolný typ objektu. Například následující kód vytvoří prvek, který obsahuje číslo s plovoucí desetinou čárkou jako obsah:
XElement n = new XElement("Cost", 324.50);
Console.WriteLine(n);
Tento příklad vytvoří následující výstup:
<Cost>324.5</Cost>
Číslo s plovoucí desetinou čárkou je v rámečku a předáno konstruktoru. Boxed number is converted to a string and used as the content of the element.
Příklad: Vytvoření elementu XElement s podřízeným elementem
Pokud předáte instanci XElement třídy pro argument obsahu, konstruktor vytvoří prvek s podřízeným elementem:
XElement shippingUnit = new XElement("ShippingUnit",
new XElement("Cost", 324.50)
);
Console.WriteLine(shippingUnit);
Tento příklad vytvoří následující výstup:
<ShippingUnit>
<Cost>324.5</Cost>
</ShippingUnit>
Příklad: Vytvoření elementu XElement s více podřízenými elementy
Obsah můžete předat několika XElement objektům. Každý z XElement objektů je součástí podřízeného prvku.
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);
Tento příklad vytvoří následující výstup:
<Address>
<Street1>123 Main St</Street1>
<City>Mercer Island</City>
<State>WA</State>
<Postal>68042</Postal>
</Address>
Rozšířením předchozího příkladu můžete vytvořit celý strom XML následujícím způsobem:
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);
Tento příklad vytvoří následující výstup:
<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říklad: Vytvoření XElementu s XAttribute
Pokud předáte instanci XAttribute třídy pro argument obsahu, konstruktor vytvoří prvek s atributem:
XElement phone = new XElement("Phone",
new XAttribute("Type", "Home"),
"555-555-5555");
Console.WriteLine(phone);
Tento příklad vytvoří následující výstup:
<Phone Type="Home">555-555-5555</Phone>
Příklad: Vytvoření prázdného elementu
Pokud chcete vytvořit prázdný XElementobjekt, nepředávejte konstruktoru žádný obsah. Následující příklad vytvoří prázdný prvek:
XElement n = new XElement("Customer");
Console.WriteLine(n);
Tento příklad vytvoří následující výstup:
<Customer />
Příklad: Připojení vs. klonování
Jak už bylo zmíněno dříve, při přidávání XNode (včetně XElement) nebo XAttribute objektů, pokud nový obsah nemá nadřazený, jsou objekty jednoduše připojeny ke stromu XML. Pokud je nový obsah již nadřazený a je součástí jiného stromu XML, nový obsah se naklonuje a nově naklonovaný obsah se připojí ke stromu XML.
Následující příklad ukazuje chování při přidání nadřazeného elementu do stromu a při přidání elementu bez nadřazeného prvku do stromu:
// 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