Bagikan melalui


Perbandingan JalurX dan LINQ ke XML

JalurX dan LINQ ke XML serupa dalam beberapa cara. Keduanya dapat digunakan untuk mengkueri pohon XML, mengembalikan hasil seperti kumpulan elemen, kumpulan atribut, kumpulan node, atau nilai elemen atau atribut. Namun, ada perbedaan yang signifikan antara kedua opsi tersebut.

Perbedaan antara JalurX dan LINQ ke XML

JalurX tidak mengizinkan proyeksi jenis baru. Ini hanya dapat mengembalikan kumpulan node dari pohon, sedangkan LINQ ke XML dapat menjalankan kueri dan memproyeksikan grafik objek atau pohon XML dalam bentuk baru. Kueri LINQ ke XML dapat melakukan lebih banyak hal daripada ekspresi JalurX.

Ekspresi JalurX ada secara terisolasi dalam string. Pengompilasi C# tidak dapat membantu mengurai ekspresi JalurX pada saat kompilasi. Sebaliknya, kueri LINQ ke XML diurai dan dikompilasi oleh pengompilasi C#. Pengompilasi dapat menangkap banyak kesalahan kueri.

Hasil JalurX tidak berjenis kuat. Dalam sejumlah keadaan, hasil evaluasi ekspresi JalurX adalah objek, dan menjadi wewenang pengembang untuk menentukan jenis yang tepat dan mentransmisikan hasilnya sesuai kebutuhan. Sebaliknya, proyeksi dari kueri LINQ ke XML sangat berjenis kuat.

Pengurutan hasil

Rekomendasi JalurX 1.0 menyatakan bahwa koleksi yang merupakan hasil evaluasi ekspresi JalurX tidak diurutkan.

Namun, saat melakukan iterasi melalui koleksi yang dikembalikan oleh metode sumbu JalurX LINQ ke XML, node dalam koleksi dikembalikan dalam urutan dokumen. Ini terjadi bahkan ketika mengakses sumbu JalurX di mana predikat dinyatakan dalam urutan dokumen terbalik, seperti preceding dan preceding-sibling.

Sebaliknya, sebagian besar sumbu LINQ ke XML mengembalikan koleksi dalam urutan dokumen. Namun, dua di antaranya, Ancestors dan AncestorsAndSelf, mengembalikan koleksi dalam urutan dokumen terbalik. Tabel berikut menghitung sumbu, dan menunjukkan urutan koleksi untuk masing-masing:

Sumbu LINQ ke XML Memesan
XContainer.DescendantNodes Urutan dokumen
XContainer.Descendants Urutan dokumen
XContainer.Elements Urutan dokumen
XContainer.Nodes Urutan dokumen
XContainer.NodesAfterSelf Urutan dokumen
XContainer.NodesBeforeSelf Urutan dokumen
XElement.AncestorsAndSelf Urutan dokumen terbalik
XElement.Attributes Urutan dokumen
XElement.DescendantNodesAndSelf Urutan dokumen
XElement.DescendantsAndSelf Urutan dokumen
XNode.Ancestors Urutan dokumen terbalik
XNode.ElementsAfterSelf Urutan dokumen
XNode.ElementsBeforeSelf Urutan dokumen
XNode.NodesAfterSelf Urutan dokumen
XNode.NodesBeforeSelf Urutan dokumen

Predikat posisi

Dalam ekspresi JalurX, predikat posisi dinyatakan terkait urutan dokumen untuk banyak sumbu, tetapi dinyatakan dalam urutan dokumen terbalik untuk sumbu terbalik. Sumbu terbalik antara lain: preceding, preceding-sibling, ancestor, dan ancestor-or-self. Misalnya, ekspresi JalurX preceding-sibling::*[1] mengembalikan elemen sejawat sebelumnya. Hal ini terjadi meskipun kumpulan hasil akhir disajikan dalam urutan dokumen.

Sebaliknya, semua predikat posisi dalam LINQ ke XML selalu dinyatakan dalam urutan sumbu. Misalnya, anElement.ElementsBeforeSelf().ElementAt(0) mengembalikan elemen turunan pertama dari induk elemen yang dikueri, bukan elemen sejawat sebelumnya. Contoh lain: anElement.Ancestors().ElementAt(0) mengembalikan elemen induk.

Jika ingin menemukan elemen sebelumnya di LINQ ke XML, Anda perlu menulis ekspresi berikut:

ElementsBeforeSelf().Last()
ElementsBeforeSelf().Last()

Perbedaan performa

Kueri JalurX yang menggunakan fungsionalitas JalurX di LINQ ke XML akan lebih lambat daripada kueri LINQ ke XML.

Perbandingan komposisi

Komposisi kueri LINQ ke XML mirip dengan komposisi ekspresi JalurX, tetapi sintaksnya sangat berbeda.

Misalnya, jika memiliki elemen dalam variabel bernama customers, dan Anda ingin menemukan elemen cucu bernama CompanyName di bawah semua elemen turunan bernama Customer, Anda akan menulis ekspresi JalurX ini:

customers.XPathSelectElements("./Customer/CompanyName")
customers.XPathSelectElements("./Customer/CompanyName")

Kueri LINQ ke XML yang setara adalah:

customers.Elements("Customer").Elements("CompanyName")
customers.Elements("Customer").Elements("CompanyName")

Terdapat paralel yang sama untuk masing-masing sumbu JalurX.

Sumbu JalurX Sumbu LINQ ke XML
turunan (sumbu default) XContainer.Elements
Induk (..) XObject.Parent
sumbu atribut (@) XElement.Attribute

or

XElement.Attributes
sumbu leluhur XNode.Ancestors
sumbu ancestor-or-self XElement.AncestorsAndSelf
sumbu keturunan (//) XContainer.Descendants

or

XContainer.DescendantNodes
descendant-or-self XElement.DescendantsAndSelf

or

XElement.DescendantNodesAndSelf
following-sibling XNode.ElementsAfterSelf

or

XNode.NodesAfterSelf
preceding-sibling XNode.ElementsBeforeSelf

or

XNode.NodesBeforeSelf
mengikuti Tidak memiliki persamaan langsung.
sebelumnya Tidak memiliki persamaan langsung.