Megosztás a következőn keresztül:


LINQ–XML és DOM

Ez a cikk a LINQ és az XML közötti főbb különbségeket ismerteti, valamint a jelenlegi elsődleges XML-programozási API-t, a W3C-dokumentumobjektum-modellt (DOM).

XML-fák létrehozásának új módjai

A W3C DOM-ban egy XML-fát hozhat létre alulról felfelé; vagyis létrehoz egy dokumentumot, elemeket hoz létre, majd hozzáadja az elemeket a dokumentumhoz.

Az alábbi példa például egy XML-fa létrehozásának tipikus módját használja a DOM Microsoft-implementációjának használatával. 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)

Ez a kódolási stílus elrejti az XML-fa szerkezetét. A LINQ-ből XML-be egy alternatív megközelítést is támogat, a funkcionális szerkezetet, amely jobban mutatja a szerkezetet. Ez a megközelítés a konstruktorokkal és XAttribute a XElement konstruktorokkal is elvégezhető. A Visual Basicben XML-literálokkal is elvégezhető. Ez a példa bemutatja ugyanazon XML-fa funkcionális konstrukcióval történő felépítését:

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>

Figyelje meg, hogy az XML-fa létrehozásához a kód behúzása a mögöttes XML szerkezetét mutatja. A Visual Basic verziója XML-literálokat használ.

További információ: XML-fák.

Közvetlen munka XML-elemekkel

Ha XML-fájllal programozza a programot, az elsődleges fókusz általában az XML-elemekre és esetleg az attribútumokra kerül. A LINQ-ban az XML-ben közvetlenül dolgozhat XML-elemekkel és attribútumokkal. Például a következőket teheti:

  • XML-elemek létrehozása dokumentumobjektum használata nélkül. Ez leegyszerűsíti a programozást, ha XML-fák töredékeivel kell dolgoznia.
  • Objektumok betöltése T:System.Xml.Linq.XElement közvetlenül XML-fájlból.
  • Objektumok szerializálása T:System.Xml.Linq.XElement fájlba vagy streambe.

Hasonlítsa össze ezt a W3C DOM-et, amelyben az XML-dokumentumot az XML-fa logikai tárolójaként használják. A DOM-ban XML-csomópontokat, köztük elemeket és attribútumokat kell létrehozni egy XML-dokumentum kontextusában. Íme egy kódrészlet, amely létrehoz egy névelemet a DOM-ban:

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)

Ha több dokumentumon szeretne elemet használni, importálnia kell a csomópontokat a dokumentumok között. A LINQ–XML elkerüli ezt az összetettségi réteget.

HA LINQ-t használ XML-hez, az XDocument osztályt csak akkor használja, ha megjegyzést vagy feldolgozási utasítást szeretne hozzáadni a dokumentum gyökérszintjén.

Nevek és névterek egyszerűsített kezelése

A nevek, névterek és névtérelőtagok kezelése általában az XML-programozás összetett része. A LINQ–XML leegyszerűsíti a neveket és a névtereket azáltal, hogy megszünteti a névtér-előtagok kezelésére vonatkozó követelményt. Ha szabályozni szeretné a névtér előtagokat, megteheti. Ha azonban úgy dönt, hogy nem szabályozza explicit módon a névtér előtagjait, a LINQ az XML-hez névtérelőtagokat rendel hozzá a szerializálás során, ha szükséges, vagy ha nem, akkor az alapértelmezett névterek használatával szerializálja őket. Ha alapértelmezett névtereket használ, az eredményül kapott dokumentumban nem lesznek névtérelőtagok. További információ: Névterek áttekintése.

A DOM-tal kapcsolatos másik probléma az, hogy nem engedélyezi a csomópont nevének módosítását. Ehelyett létre kell hoznia egy új csomópontot, és át kell másolnia az összes gyermekcsomópontot, elveszítve az eredeti csomópontidentitást. A linq to XML elkerüli ezt a problémát azáltal, hogy engedélyezi a XName tulajdonság beállítását egy csomóponton.

Statikus metódus támogatása XML-fájl betöltéséhez

A LINQ-ről XML-be történő betöltéshez statikus metódusokat használhat a példánymetodumok helyett. Ez leegyszerűsíti a betöltést és az elemzést. További információ: XML betöltése fájlból.

DTD-szerkezetek támogatásának eltávolítása

A LINQ–XML tovább egyszerűsíti az XML-programozást azáltal, hogy eltávolítja az entitások és entitáshivatkozások támogatását. Az entitások kezelése összetett, és ritkán használatos. A támogatás eltávolítása növeli a teljesítményt, és leegyszerűsíti a programozási felületet. Ha egy LINQ-XML-fa fel van töltve, az összes DTD-entitás ki lesz bontva.

Töredékek támogatása

A LINQ az XML-hez nem biztosít egyenértékű osztályt XmlDocumentFragment . A koncepció azonban sok esetben kezelhető egy olyan lekérdezés eredményével, XmlDocumentFragment amely a következőként van begépelve IEnumerable<T>XNode: vagy IEnumerable<T>XElement.

Az XPathNavigator támogatása

A LINQ-ből XML-be bővítménymetszeteket is támogat XPathNavigator a System.Xml.XPath névtérben. További információ: System.Xml.XPath.Extensions.

Térköz és behúzás támogatása

A LINQ-ről XML-re való fordítás egyszerűbben kezeli a szabad területet, mint a DOM.

Gyakori forgatókönyv a behúzott XML beolvasása, a memóriában lévő XML-fa létrehozása üres szóközök nélküli szövegcsomópontok nélkül (azaz a szabad terület megőrzése nélkül), műveletek végrehajtása az XML-en, majd az XML behúzással történő mentése. Ha formázással szerializálja az XML-fájlt, az XML-fa csak jelentős üres területet őriz meg. Ez a LINQ-XML alapértelmezett viselkedése.

Egy másik gyakori forgatókönyv a szándékosan behúzott XML olvasása és módosítása. Előfordulhat, hogy ezt a behúzást semmilyen módon nem szeretné módosítani. A LINQ-ban az XML-ben ezt a következő módon teheti meg:

  • Üres terület megőrzése az XML betöltésekor vagy elemzésekor.
  • A formázás letiltása az XML szerializálásakor.

A LINQ–XML csomópontként XText tárolja a szabad helyet ahelyett, hogy speciális Whitespace csomóponttípussal rendelkezik, mint a DOM.

Széljegyzetek támogatása

A LINQ–XML-elemek támogatják a széljegyzetek bővíthető készletét. Ez hasznos lehet az elemekkel kapcsolatos egyéb információk nyomon követéséhez, például a sémainformációkhoz, az elem felhasználói felülethez való kötődésének vagy bármilyen más alkalmazásspecifikus információnak a nyomon követéséhez. További információ: LINQ to XML annotations.

Sémainformációk támogatása

A LINQ to XML a névtérben lévő bővítménymetszetekkel támogatja az XSD-érvényesítést System.Xml.Schema . Ellenőrizheti, hogy egy XML-fa megfelel-e az XSD-nek. Az XML-fát feltöltheti a sémaérvényesítés utáni adatkészlettel (PSVI). További információt az XSD és Extensionsa .

Lásd még