Şimdi öğreniyorum XmlDocumentama yeni koştum XDocumentve aralarındaki farkı veya faydaları araştırmaya çalıştığımda yararlı bir şey bulamıyorum, lütfen neden birini diğerinin üzerinde kullanacağını söyleyebilir misin?
Şimdi öğreniyorum XmlDocumentama yeni koştum XDocumentve aralarındaki farkı veya faydaları araştırmaya çalıştığımda yararlı bir şey bulamıyorum, lütfen neden birini diğerinin üzerinde kullanacağını söyleyebilir misin?
Yanıtlar:
.NET sürüm 3.0 veya önceki bir sürümünü kullanıyorsanız, diğer bir deyişle klasik DOM API'sini kullanmanız gerekirXmlDocument . Benzer şekilde, bunu bekleyecek başka API'lar da olduğunu göreceksiniz.
Ancak seçim alırsanız, iyice XDocumentaka LINQ to XML kullanmanızı tavsiye ederim . Bu var çok belge oluşturmak ve bunları işlemek için daha basit. Örneğin, aşağıdakiler arasındaki farktır:
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);
ve
XDocument doc = new XDocument(
new XElement("root",
new XAttribute("name", "value"),
new XElement("child", "text node")));
Ad alanları, şimdiye kadar gördüğüm diğer XML API'larının aksine, LINQ to XML'de çalışmak oldukça kolaydır:
XNamespace ns = "http://somewhere.com";
XElement element = new XElement(ns + "elementName");
// etc
LINQ to XML, LINQ ile de çok iyi çalışır - yapım modeli, alt eleman dizileriyle öğeleri kolayca oluşturmanıza olanak tanır:
// 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
));
Genel LINQ stiline uyan çok daha açıklayıcı.
Şimdi Brannon'un belirttiği gibi, bunlar akışlı olanlar yerine bellek içi API'lerdir ( XStreamingElementtembel çıktıları desteklese de). XmlReaderve XmlWriterXML'de .NET akışının normal yollarıdır, ancak tüm API'ları bir dereceye kadar karıştırabilirsiniz. Örneğin, büyük bir belgeyi aktarabilir, ancak XmlReaderbir öğenin başlangıcında bir konumlandırarak , bir öğeyi okuyarak XElementve işleyerek, ardından bir sonraki öğeye geçerek LINQ'dan XML'e kullanabilirsiniz . Bu teknik hakkında çeşitli blog gönderileri vardır, İşte hızlı bir arama ile buldum .
Ben cevapların sürpriz hiçbiri bugüne kadar gerçeği bahseder duyuyorum XmlDocumenthiçbir satır bilgi sağlar iken, XDocumentyapar (aracılığıyla IXmlLineInfobir arayüz).
Bu, bazı durumlarda kritik bir özellik olabilir (örneğin, bir XML'deki hataları bildirmek veya öğelerin genel olarak nerede tanımlandığını takip etmek istiyorsanız) ve kullanarak XmlDocumentdaha sonra kullanmaya mutlu bir şekilde başlamadan önce bunun farkında olmanız daha iyi olur hepsini değiştirmek zorunda olduğunuzu keşfedin.
XDocumenthat bilgilerini sağladığını onaylıyorum . Bkz XDocument.Load ile LoadOptions.SetLineInfobir parametre olarak verilir. Eğer hat bilgisi almanın bir yolunu biliyorsanız XmlDocumentmerak ediyorum; bu cevabı yazdığımda hiç bulamadım. Bu diğer yanıt onaylıyor gibi görünüyor: stackoverflow.com/a/33622102/253883
XmlDocumentXML DOM nesne modelini bilen geliştiriciler için mükemmeldir. Bir süredir piyasada ve az ya da çok bir W3C standardına karşılık geliyor. Manuel navigasyonun yanı sıra XPathdüğüm seçimini de destekler .
XDocument.NET 3.5'te LINQ to XML özelliğini güçlendirir. Ağır C kullanır IEnumerable<>ve düz C # ile çalışmak daha kolay olabilir.
Her iki belge modeli de belgenin tamamını belleğe yüklemenizi gerektirir ( XmlReaderörneğin aksine ).
XDocumentLINQ'dan XML API'sına ve XML XmlDocumentiçin standart DOM stili API'dir. DOM'u iyi tanıyorsanız ve LINQ to XML öğrenmek istemiyorsanız, devam edin XmlDocument. Her ikisinde de yeniyseniz, ikisini karşılaştıran bu sayfaya göz atın ve hangisini daha iyi beğendiğinizi seçin.
LINQ to XML kullanmaya yeni başladım ve fonksiyonel yapıyı kullanarak bir XML belgesi oluşturma şeklinizi seviyorum. Gerçekten güzel. Karşılaştırmada DOM tıknaz.
Başka bir yerde de belirtildiği gibi, hiç şüphesiz, Linq to Xml xml belgelerinin oluşturulmasını ve değiştirilmesini kıyaslandığında bir esinti yapar XmlDocumentve XNamespace ns + "elementName"sözdizimi ad alanlarıyla uğraşırken keyifli bir okuma sağlar.
Bahsetmeye değer xslve xpathdikkat edilmesi gereken bir şey xpath 1.0, Linq 2 Xml'de keyfi ifadeleri şu şekilde dahil ederek yürütmenin mümkün olduğudur XNodes:
using System.Xml.XPath;
ve sonra xpathşu uzantı yöntemlerini kullanarak verilerde gezinebilir ve yansıtabiliriz :
Örneğin, Xml belgesi verildiğinde:
<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>
Değerlendirebiliriz:
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)");
Bunun XDocumentçok daha fazla nesne oluşturma çağrısı yaptığına inanıyorum . Çok fazla XML belgesi işlerken XMLDocumentdaha hızlı olacağından şüpheleniyorum .
Bunun gerçekleştiği yerlerden biri tarama verilerini yönetmektir. Birçok tarama aracı, verilerini XML olarak çıkarır (bariz nedenlerle). Bu tarama dosyalarının çoğunu işlemeniz gerekiyorsa, bence daha iyi bir performansa sahip olacaksınız XMLDocument.