Bagikan melalui


LINQ ke XML vs DOM

Artikel ini menjelaskan beberapa perbedaan utama antara LINQ ke XML dan API pemrograman XML dominan saat ini, Model Objek Dokumen W3C (DOM).

Cara baru untuk membuat pohon XML

Di W3C DOM, Anda membangun pohon XML dari bawah ke atas; artinya, Anda membuat dokumen, membuat elemen, lalu menambahkan elemen ke dokumen.

Misalnya, contoh berikut menggunakan cara umum untuk membuat pohon XML menggunakan implementasi Microsoft DOM, 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)

Gaya pengkodan ini menyembunyikan struktur pohon XML. LINQ ke XML juga mendukung pendekatan alternatif, konstruksi fungsi, yang lebih menunjukkan struktur. Pendekatan ini dapat dilakukan dengan konstruktor XElement dan XAttribute. Pada Visual Basic, hal tersebut juga dapat dilakukan dengan literal XML. Contoh ini menunjukkan konstruksi pohon XML yang sama menggunakan konstruksi fungsional:

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>

Perhatikan bahwa mengindentasi kode untuk membuat pohon XML menunjukkan struktur XML yang mendasar. Versi Visual Basic menggunakan literal XML.

Untuk informasi selengkapnya, lihat Pohon XML.

Bekerja langsung dengan elemen XML

Saat Anda memprogram dengan XML, fokus utama Anda biasanya pada elemen XML dan mungkin pada atribut. Di LINQ ke XML, Anda dapat bekerja langsung dengan elemen dan atribut XML. Di sini, Anda dapat melakukan hal berikut:

  • Buat elemen XML tanpa menggunakan objek dokumen. Ini menyederhanakan pemrograman ketika Anda harus bekerja dengan fragmen pohon XML.
  • Muat T:System.Xml.Linq.XElement objek langsung dari file XML.
  • Menserialisasikan T:System.Xml.Linq.XElement objek ke file atau aliran.

Bandingkan ini dengan W3C DOM, di mana dokumen XML digunakan sebagai kontainer logis untuk pohon XML. Di DOM, simpul XML, termasuk elemen dan atribut, harus dibuat dalam konteks dokumen XML. Berikut adalah fragmen kode untuk membuat elemen nama di 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)

Jika Anda ingin menggunakan elemen di beberapa dokumen, Anda harus mengimpor simpul di seluruh dokumen. LINQ ke XML menghindari lapisan kompleksitas ini.

Saat menggunakan LINQ ke XML, Anda hanya menggunakan XDocument kelas jika Anda ingin menambahkan komentar atau instruksi pemrosesan di tingkat akar dokumen.

Penanganan nama dan namespace yang disederhanakan

Menangani nama, namespace, dan awalan namespace umumnya merupakan bagian kompleks dari pemrograman XML. LINQ ke XML menyederhanakan nama dan ruang nama dengan menghilangkan keharusan menggunakan prefiks ruang nama. Jika Anda ingin mengontrol awalan ruang nama, Anda bisa. Tetapi jika Anda memutuskan untuk tidak secara eksplisit mengontrol awalan namespace, LINQ ke XML akan menambahkan awalan namespace selama serialisasi jika diperlukan, atau akan melakukan serialisasi menggunakan namespace default jika tidak. Jika namespace default digunakan, tidak akan ada awalan namespace dalam dokumen yang dihasilkan. Untuk informasi selengkapnya, lihat Gambaran umum Namespace.

Masalah lain dengan DOM adalah tidak memungkinkan Anda mengubah nama simpul. Sebagai gantinya, Anda harus membuat simpul baru dan menyalin semua simpul anak ke dalamnya, yang mengakibatkan hilangnya identitas simpul asli. LINQ ke XML menghindari masalah ini dengan memungkinkan Anda menyetel properti XName pada simpul.

Dukungan metode statis untuk memuat XML

LINQ ke XML memungkinkan Anda memuat XML dengan menggunakan metode statis, bukan metode instans. Ini menyederhanakan pemuatan dan penguraian. Untuk informasi selengkapnya, lihat Cara memuat XML dari file.

Penghapusan dukungan untuk konstruksi DTD

LINQ ke XML lebih menyederhanakan pemrograman XML dengan menghapus dukungan untuk entitas dan referensi entitas. Pengelolaan entitas bersifat kompleks, dan jarang digunakan. Menghapus dukungan mereka meningkatkan performa dan menyederhanakan antarmuka pemrograman. Saat pohon LINQ ke XML diisi, semua entitas DTD diperluas.

Dukungan untuk fragmen

LINQ ke XML tidak menyediakan yang setara untuk kelas tersebut XmlDocumentFragment . Namun, dalam banyak kasus, XmlDocumentFragment konsep dapat diatasi dengan hasil kueri yang diketik sebagai IEnumerable<T>XNode, atau IEnumerable<T> dari XElement.

Dukungan untuk XPathNavigator

LINQ untuk XML menyediakan dukungan untuk XPathNavigator melalui metode ekstensi di namespace System.Xml.XPath. Untuk informasi selengkapnya, lihat System.Xml.XPath.Extensions .

Dukungan untuk spasi kosong dan indentasi

LINQ ke XML menangani spasi kosong lebih sederhana daripada DOM.

Skenario umumnya adalah membaca XML yang diindentasi, membuat pohon XML dalam memori tanpa simpul teks spasi kosong (yaitu, tidak mempertahankan spasi kosong), melakukan beberapa operasi pada XML, lalu menyimpan XML dengan indentasi. Saat Anda membuat serial XML dengan pemformatan, hanya ruang kosong yang signifikan di pohon XML yang dipertahankan. Ini adalah perilaku default untuk LINQ ke XML.

Skenario umum lainnya adalah membaca dan memodifikasi XML yang telah sengaja diindentasikan. Anda mungkin tidak ingin mengubah indentasi ini dengan cara apa pun. Di LINQ ke XML, Anda dapat melakukan ini dengan:

  • Mempertahankan spasi kosong saat Anda memuat atau mengurai XML.
  • Menonaktifkan pemformatan saat Anda menserialisasikan XML.

LINQ ke XML menyimpan spasi kosong sebagai simpul XText alih-alih memiliki jenis node khusus Whitespace, seperti DOM.

Dukungan untuk anotasi

Elemen LINQ ke XML mendukung serangkaian anotasi yang dapat diperluas. Ini berguna untuk melacak informasi lain-lain tentang elemen, seperti informasi skema, informasi tentang apakah elemen terikat ke UI, atau jenis informasi spesifik aplikasi lainnya. Untuk informasi selengkapnya, lihat Anotasi LINQ ke XML.

Dukungan untuk informasi skema

LINQ ke XML menyediakan dukungan untuk validasi XSD melalui metode ekstensi di System.Xml.Schema namespace. Anda dapat memvalidasi bahwa pohon XML mematuhi XSD. Anda dapat mengisi pohon XML dengan himpunan info validasi pasca-skema (PSVI). Untuk informasi selengkapnya, lihat Cara memvalidasi menggunakan XSD dan Extensions.

Lihat juga