XDocument atau XmlDocument

503

Saya sekarang belajar XmlDocumenttetapi saya baru saja bertemu XDocumentdan ketika saya mencoba mencari perbedaan atau manfaatnya saya tidak dapat menemukan sesuatu yang berguna, dapatkah Anda memberi tahu saya mengapa Anda akan menggunakan satu sama lain?

Tarik
sumber
13
Saya bertanya-tanya mengapa orang-orang dokumentasi di Microsoft tidak menaruh catatan atau komentar di MSDN untuk mengklarifikasi perbedaan mereka atau kapan harus menggunakan apa.
Kamran Bigdely
1
Beberapa info tentang msdn: msdn.microsoft.com/en-us/library/… . Dan pertanyaan kinerja: stackoverflow.com/questions/4383919/… . Secara pribadi saya merasa lebih mudah untuk bekerja dengan LINQ ke XML.
nawfal

Jawaban:

500

Jika Anda menggunakan .NET versi 3.0 atau lebih rendah, Anda harus menggunakan XmlDocumentalias DOM API klasik. Anda juga akan menemukan beberapa API lain yang akan mengharapkan ini.

Jika Anda mendapatkan pilihan, bagaimanapun, saya benar-benar akan merekomendasikan menggunakan XDocumentalias LINQ ke XML. Jauh lebih mudah untuk membuat dokumen dan memprosesnya. Misalnya, perbedaan antara:

XmlDocument doc = new XmlDocument();
XmlElement root = doc.CreateElement("root");
root.SetAttribute("name", "value");
XmlElement child = doc.CreateElement("child");
child.InnerText = "text node";
root.AppendChild(child);
doc.AppendChild(root);

dan

XDocument doc = new XDocument(
    new XElement("root",
                 new XAttribute("name", "value"),
                 new XElement("child", "text node")));

Namespaces cukup mudah digunakan di LINQ to XML, tidak seperti API XML lain yang pernah saya lihat:

XNamespace ns = "http://somewhere.com";
XElement element = new XElement(ns + "elementName");
// etc

LINQ ke XML juga bekerja sangat baik dengan LINQ - model konstruksinya memungkinkan Anda untuk membangun elemen dengan urutan sub-elemen dengan sangat mudah:

// Customers is a List<Customer>
XElement customersElement = new XElement("customers",
    customers.Select(c => new XElement("customer",
        new XAttribute("name", c.Name),
        new XAttribute("lastSeen", c.LastOrder)
        new XElement("address",
            new XAttribute("town", c.Town),
            new XAttribute("firstline", c.Address1),
            // etc
    ));

Semuanya jauh lebih deklaratif, yang cocok dengan gaya LINQ umum.

Sekarang seperti yang disebutkan oleh Brannon, ini adalah API dalam memori dan bukan yang streaming (meskipun XStreamingElementmendukung output malas). XmlReaderdan XmlWritermerupakan cara normal streaming XML dalam .NET, tetapi Anda dapat mencampur semua API sampai batas tertentu. Misalnya, Anda dapat melakukan streaming dokumen besar tetapi menggunakan LINQ ke XML dengan memposisikan sebuah XmlReaderdi awal elemen, membaca XElementdari dan memprosesnya, kemudian pindah ke elemen berikutnya dll. Ada berbagai posting blog tentang teknik ini, inilah yang saya temukan dengan pencarian cepat .

Jon Skeet
sumber
Bisakah Anda memberi tahu saya mengapa mereka berbeda? Maksud saya ya XDocument terlihat cukup rapi tetapi untuk perbedaan level DOM, bukankah keduanya xml, apakah ada skema yang menunjukkan Microsoft X-DOM dan W3C Compliant DOM? Terima kasih.
Tarik
3
Apa yang Anda maksud dengan "skema" dan apa yang Anda maksud dengan "pertunjukan"? Ya, mereka berdua berurusan dengan XML standar, tetapi LINQ ke XML hanyalah API yang lebih bagus untuk sebagian besar hal. Banyak teknologi di balik LINQ ke XML tidak tersedia sebelum. NET 3.5.
Jon Skeet
Maksud saya apakah model objek dokumen mereka berbeda?
Tarik
6
Yah mereka berdua API untuk XML itu sendiri, jadi dalam arti mereka tidak berbeda, tidak. Saya menduga keduanya memiliki beberapa keterbatasan (dan ada LINQ untuk XML yang saya tahu tetapi tidak bisa mengingatnya) tetapi dalam kebanyakan kasus Anda hanya dapat memperlakukan mereka sebagai model yang sama dengan representasi yang sedikit berbeda.
Jon Skeet
1
@SensorSmith: Itu tidak mencakup semua bonus lainnya, seperti perataan urutan secara otomatis, penanganan DateTime dll. Anda juga dapat menambahkan metode ekstensi untuk semua itu, tetapi mengapa menciptakan kembali LINQ ke XML ketika Anda bisa menggunakannya saja?
Jon Skeet
57

Saya terkejut tidak ada jawaban sejauh ini menyebutkan fakta yang XmlDocumenttidak memberikan informasi garis , sementara XDocumenttidak (melalui IXmlLineInfoantarmuka).

Ini bisa menjadi fitur penting dalam beberapa kasus (misalnya jika Anda ingin melaporkan kesalahan dalam XML, atau melacak di mana elemen didefinisikan secara umum) dan Anda sebaiknya mengetahui hal ini sebelum Anda dengan senang hati mulai menerapkan penggunaan menggunakan XmlDocument, untuk nanti temukan Anda harus mengubah semuanya.

Julien Guertault
sumber
1
Dan saya terkejut tidak ada yang memperhatikan bahwa pernyataan Anda benar. XmlDocument TIDAK menyediakan informasi baris sementara XDocument tidak.
VVS
4
@VVS: Anda membuat saya khawatir sejenak bahwa saya telah membuat kesalahan ketik yang mengerikan, tetapi setelah memeriksa ulang, saya mengonfirmasi bahwa hal XDocumentitu memberikan informasi jalur. Lihat XDocument.Load dengan LoadOptions.SetLineInfosebagai argumen kedua. Jika Anda tahu cara mendapatkan informasi lini dengan XmlDocumentsaya ingin tahu; kembali ketika saya menulis jawaban ini saya tidak dapat menemukannya. Jawaban lain ini tampaknya mengonfirmasi: stackoverflow.com/a/33622102/253883
Julien Guertault
1
"dan Anda sebaiknya mengetahui hal ini sebelum Anda dengan senang hati mulai menerapkan menggunakan XmlDocument, untuk kemudian menemukan Anda harus mengubah semuanya." Tebak apa yang baru saja saya lakukan :)
Paul
36

XmlDocumentsangat bagus untuk pengembang yang terbiasa dengan model objek XML DOM. Sudah ada untuk sementara waktu, dan kurang lebih sesuai dengan standar W3C. Ini mendukung navigasi manual serta XPathpemilihan simpul.

XDocumentmendukung fitur LINQ ke XML di .NET 3.5. Itu membuat penggunaan berat IEnumerable<>dan dapat lebih mudah untuk bekerja dengan C # lurus.

Kedua model dokumen mengharuskan Anda untuk memuat seluruh dokumen ke dalam memori (tidak seperti XmlReadermisalnya).

Brannon
sumber
3
Saya pikir Anda bermaksud "dan bisa lebih mudah untuk bekerja dengan VB.net langsung". Karena VB mendukung pembuatan elemen langsung di mana C # masih membutuhkan kode.
Brain2000
24

Seperti yang disebutkan di tempat lain, tidak diragukan lagi, Linq ke Xml membuat penciptaan dan perubahan dokumen xml sangat mudah dibandingkan dengan XmlDocument, dan XNamespace ns + "elementName"sintaksnya membuat bacaan yang menyenangkan ketika berhadapan dengan ruang nama.

Satu hal yang layak untuk disebutkan xsldan xpathperlu diperhatikan adalah bahwa masih dimungkinkan untuk mengeksekusi xpath 1.0ekspresi arbitrer pada Linq 2 Xml XNodesdengan memasukkan:

using System.Xml.XPath;

dan kemudian kita dapat menavigasi dan memproyeksikan data menggunakan xpathmelalui metode ekstensi ini:

Misalnya, diberikan dokumen Xml:

<xml>
    <foo>
        <baz id="1">10</baz>
        <bar id="2" special="1">baa baa</bar>
        <baz id="3">20</baz>
        <bar id="4" />
        <bar id="5" />
    </foo>
    <foo id="123">Text 1<moo />Text 2
    </foo>
</xml>

Kami dapat mengevaluasi:

var node = xele.XPathSelectElement("/xml/foo[@id='123']");
var nodes = xele.XPathSelectElements(
"//moo/ancestor::xml/descendant::baz[@id='1']/following-sibling::bar[not(@special='1')]");
var sum = xele.XPathEvaluate("sum(//foo[not(moo)]/baz)");
StuartLC
sumber
24

XDocumentberasal dari LINQ ke XML API, dan XmlDocumentmerupakan API gaya DOM standar untuk XML. Jika Anda mengenal DOM dengan baik, dan tidak ingin belajar LINQ ke XML, ikuti XmlDocument. Jika Anda baru mengenal keduanya, lihat halaman ini yang membandingkan keduanya, dan pilih yang mana yang Anda sukai terlihat lebih baik.

Saya baru saja mulai menggunakan LINQ ke XML, dan saya suka cara Anda membuat dokumen XML menggunakan konstruksi fungsional. Ini sangat bagus. DOM memang kikuk dibandingkan.

Daniel Chambers
sumber
14

Juga, perhatikan yang XDocumentdidukung di Xbox 360 dan Windows Phone OS 7.0. Jika Anda menargetkan mereka, kembangkan untuk XDocumentatau bermigrasi dari XmlDocument.

daratan
sumber
-8

Saya percaya itu XDocumentmembuat lebih banyak objek penciptaan panggilan. Saya menduga bahwa ketika Anda menangani banyak dokumen XML, XMLDocumentakan lebih cepat.

Satu tempat ini terjadi adalah dalam mengelola data pindai. Banyak alat pindai mengeluarkan data mereka dalam XML (untuk alasan yang jelas). Jika Anda harus memproses banyak file pemindaian ini, saya pikir Anda akan memiliki kinerja yang lebih baik XMLDocument.

Brian
sumber
11
Saya pikir Anda harus mendukung komentar Anda dengan angka lain kali, karena saya yakin Anda mungkin salah. Lihat blogs.msdn.com/b/codejunkie/archive/2008/10/08/...
mike