Sdílet prostřednictvím


LINQ to XML vs. DOM

Tento článek popisuje některé klíčové rozdíly mezi LINQ to XML a aktuální převládající programovací rozhraní API XML, W3C Document Object Model (DOM).

Nové způsoby vytváření stromů XML

V modelu W3C DOM vytvoříte strom XML zespodu nahoru; to znamená, že vytvoříte dokument, vytvoříte prvky a pak do dokumentu přidáte prvky.

Například následující příklad používá typický způsob, jak vytvořit strom XML pomocí implementace DOM od Microsoftu, XmlDocument.

XmlDocument doc = new XmlDocument();
XmlElement name = doc.CreateElement("Name");
name.InnerText = "Patrick Hines";
XmlElement phone1 = doc.CreateElement("Phone");
phone1.SetAttribute("Type", "Home");
phone1.InnerText = "206-555-0144";
XmlElement phone2 = doc.CreateElement("Phone");
phone2.SetAttribute("Type", "Work");
phone2.InnerText = "425-555-0145";
XmlElement street1 = doc.CreateElement("Street1");
street1.InnerText = "123 Main St";
XmlElement city = doc.CreateElement("City");
city.InnerText = "Mercer Island";
XmlElement state = doc.CreateElement("State");
state.InnerText = "WA";
XmlElement postal = doc.CreateElement("Postal");
postal.InnerText = "68042";
XmlElement address = doc.CreateElement("Address");
address.AppendChild(street1);
address.AppendChild(city);
address.AppendChild(state);
address.AppendChild(postal);
XmlElement contact = doc.CreateElement("Contact");
contact.AppendChild(name);
contact.AppendChild(phone1);
contact.AppendChild(phone2);
contact.AppendChild(address);
XmlElement contacts = doc.CreateElement("Contacts");
contacts.AppendChild(contact);
doc.AppendChild(contacts);
Dim doc As XmlDocument = New XmlDocument()
Dim name As XmlElement = doc.CreateElement("Name")
name.InnerText = "Patrick Hines"
Dim phone1 As XmlElement = doc.CreateElement("Phone")
phone1.SetAttribute("Type", "Home")
phone1.InnerText = "206-555-0144"
Dim phone2 As XmlElement = doc.CreateElement("Phone")
phone2.SetAttribute("Type", "Work")
phone2.InnerText = "425-555-0145"
Dim street1 As XmlElement = doc.CreateElement("Street1")
street1.InnerText = "123 Main St"
Dim city As XmlElement = doc.CreateElement("City")
city.InnerText = "Mercer Island"
Dim state As XmlElement = doc.CreateElement("State")
state.InnerText = "WA"
Dim postal As XmlElement = doc.CreateElement("Postal")
postal.InnerText = "68042"
Dim address As XmlElement = doc.CreateElement("Address")
address.AppendChild(street1)
address.AppendChild(city)
address.AppendChild(state)
address.AppendChild(postal)
Dim contact As XmlElement = doc.CreateElement("Contact")
contact.AppendChild(name)
contact.AppendChild(phone1)
contact.AppendChild(phone2)
contact.AppendChild(address)
Dim contacts As XmlElement = doc.CreateElement("Contacts")
contacts.AppendChild(contact)
doc.AppendChild(contacts)
Console.WriteLine(doc.OuterXml)

Tento styl kódování skryje strukturu stromu XML. LINQ to XML také podporuje alternativní přístup, funkční konstrukci, která lépe ukazuje strukturu. Tento přístup lze realizovat pomocí konstruktorů XElement a XAttribute. V jazyce Visual Basic lze také používat literály XML. Tento příklad ukazuje vytvoření stejného stromu XML pomocí funkční konstrukce:

XElement contacts =
    new XElement("Contacts",
        new XElement("Contact",
            new XElement("Name", "Patrick Hines"),
            new XElement("Phone", "206-555-0144",
                new XAttribute("Type", "Home")),
            new XElement("phone", "425-555-0145",
                new XAttribute("Type", "Work")),
            new XElement("Address",
                new XElement("Street1", "123 Main St"),
                new XElement("City", "Mercer Island"),
                new XElement("State", "WA"),
                new XElement("Postal", "68042")
            )
        )
    );
Dim contacts = _
    <Contacts>
        <Contact>
            <Name>Patrick Hines</Name>
            <Phone Type="Home">206-555-0144</Phone>
            <Phone Type="Work">425-555-0145</Phone>
            <Address>
                <Street1>123 Main St</Street1>
                <City>Mercer Island</City>
                <State>WA</State>
                <Postal>68042</Postal>
            </Address>
        </Contact>
    </Contacts>

Všimněte si, že odsazení kódu pro vytvoření stromu XML ukazuje strukturu podkladového XML souboru. Verze jazyka Visual Basic používá literály XML.

Další informace najdete v tématu Stromy XML.

Práce přímo s elementy XML

Při programování pomocí XML je primární fokus obvykle na elementy XML a možná i na atributy. V JAZYCE LINQ to XML můžete pracovat přímo s elementy a atributy XML. Můžete například provést následující:

  • Vytvářet elementy XML bez použití objektu dokumentu vůbec. To zjednodušuje programování, když potřebujete pracovat s fragmenty stromů XML.
  • Načtěte T:System.Xml.Linq.XElement objekty přímo z XML souboru.
  • Serializace T:System.Xml.Linq.XElement objektů do souboru nebo datového proudu

Porovnejte to s objektem W3C DOM, ve kterém se dokument XML používá jako logický kontejner pro strom XML. V DOM musí být uzly XML, včetně elementů a atributů, vytvořeny v kontextu dokumentu XML. Tady je fragment kódu pro vytvoření elementu name v DOM:

XmlDocument doc = new XmlDocument();
XmlElement name = doc.CreateElement("Name");
name.InnerText = "Patrick Hines";
doc.AppendChild(name);
Dim doc As XmlDocument = New XmlDocument()
Dim name As XmlElement = doc.CreateElement("Name")
name.InnerText = "Patrick Hines"
doc.AppendChild(name)

Pokud chcete použít prvek napříč více dokumenty, musíte importovat uzly napříč dokumenty. LINQ to XML zabraňuje této vrstvě složitosti.

Pokud používáte LINQ to XML, použijete XDocument třídu pouze v případě, že chcete přidat komentář nebo zpracování instrukce na kořenové úrovni dokumentu.

Zjednodušené zpracování názvů a jmenných prostorů

Zpracování názvů, oborů názvů (namespace) a předpon oboru názvů (namespace prefixes) je obecně složitou částí programování XML. LINQ to XML zjednodušuje názvy a obory názvů tím, že eliminuje požadavek na zpracování předpon oboru názvů. Pokud chcete ovládat předpony oboru názvů, můžete. Pokud se ale rozhodnete explicitně neřídit předpony oboru názvů, LINQ to XML přiřadí předpony oboru názvů během serializace, pokud jsou povinné, nebo bude serializovat pomocí výchozích oborů názvů, pokud povinné nejsou. Pokud se použijí výchozí obory názvů, ve výsledném dokumentu nebudou žádné názvové předpony. Další informace najdete v části Přehled oborů názvů.

Dalším problémem s DOM je, že neumožňuje změnit název uzlu. Místo toho musíte vytvořit nový uzel a zkopírovat do něj všechny podřízené uzly a přijít o původní identitu uzlu. LINQ to XML zabrání tomuto problému tím, že vám umožní nastavit XName vlastnost na uzlu.

Podpora statické metody pro načítání XML

LINQ to XML umožňuje načíst XML pomocí statických metod místo metod instance. To zjednodušuje načítání a analýzu. Další informace naleznete v tématu Jak načíst XML ze souboru.

Odebrání podpory konstruktorů DTD

LINQ to XML dále zjednodušuje programování XML odebráním podpory entit a odkazů na entity. Správa entit je složitá a používá se jen zřídka. Odebrání podpory zvyšuje výkon a zjednodušuje programovací rozhraní. Při naplnění stromu LINQ pro XML jsou všechny entity DTD rozbaleny.

Podpora fragmentů

LINQ to XML neposkytuje ekvivalent pro XmlDocumentFragment třídu. V mnoha případech však lze koncept zpracovat výsledkem dotazu, který je zadaný jako XmlDocumentFragment z IEnumerable<T>, nebo XNode z IEnumerable<T>.

Podpora pro XPathNavigator

LINQ to XML poskytuje podporu XPathNavigator prostřednictvím rozšiřujících metod v System.Xml.XPath oboru názvů. Další informace najdete v tématu System.Xml.XPath.Extensions.

Podpora prázdných znaků a odsazení

LINQ to XML zpracovává prázdné znaky jednodušeji než DOM.

Běžným scénářem je čtení odsazeného XML, vytvoření stromu XML v paměti bez textových uzlů obsahujících bílé znaky (tj. nezachovávání bílých znaků), provádění některých operací s XML a následné uložení XML s odsazením. Při serializaci XML s formátováním se zachovají pouze významné prázdné znaky ve stromu XML. Toto je výchozí chování linQ to XML.

Dalším běžným scénářem je čtení a úprava XML, které už byly záměrně strukturované. Toto odsazení možná nebudete chtít žádným způsobem změnit. V LINQ to XML můžete provést takto:

  • Zachování prázdných znaků při načítání nebo analýze XML
  • Zakázání formátování při serializaci XML.

LINQ to XML ukládá prázdné znaky jako uzel XText, místo aby měl specializovaný typ uzlu Whitespace, jako má DOM.

Podpora poznámek

Elementy LINQ to XML podporují rozšiřitelnou sadu poznámek. To je užitečné pro sledování různých informací o prvku, jako jsou informace o schématu, informace o tom, zda je prvek vázán na uživatelské rozhraní nebo jakýkoli jiný druh informací specifických pro aplikaci. Další informace viz LINQ k XML anotacím.

Podpora informací o schématu

LINQ to XML poskytuje podporu pro ověřování XSD prostřednictvím metod rozšíření v System.Xml.Schema namespace. Můžete ověřit, že strom XML vyhovuje XSD. Strom XML můžete naplnit datovou sadou informací po ověření schématu (PSVI). Další informace naleznete v tématu Jak ověřit pomocí XSD a Extensions.

Viz také