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 provést s XElement konstruktory a XAttribute konstruktory. V jazyce Visual Basic lze také provádět 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 zobrazuje strukturu podkladového XML. 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 ze souboru XML.
  • 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 oborů názvů

Zpracování názvů, oborů názvů a předpon oboru názvů je obecně složitou součá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 řídit předpony oboru názvů, můžete. Pokud se ale rozhodnete explicitně řídit předpony oboru názvů, bude LINQ to XML přiřazovat předpony oboru názvů během serializace, pokud jsou povinné, nebo serializovat pomocí výchozích oborů názvů, pokud nejsou. Pokud se použijí výchozí obory názvů, ve výsledném dokumentu nebudou žádné předpony oboru názvů. Další informace najdete v tématu 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 to XML se rozbalí všechny entity DTD.

Podpora fragmentů

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

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 na webu 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í XML, vytvoření stromu XML v paměti bez prázdných textových uzlů (tj. nezachovávání prázdný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 úpravy XML, které už byly záměrně odsazené. 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 XText uzel místo specializovaného Whitespace typu uzlu, jak to dělá 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 naleznete v tématu LINQ to XML poznámky.

Podpora informací o schématu

LINQ to XML poskytuje podporu pro ověřování XSD prostřednictvím rozšiřujících metod v System.Xml.Schema oboru názvů. 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é