Şimdi öğreniyorum XmlDocument
ama yeni koştum XDocument
ve 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 XmlDocument
ama yeni koştum XDocument
ve 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 XDocument
aka 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 ( XStreamingElement
tembel çıktıları desteklese de). XmlReader
ve XmlWriter
XML'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 XmlReader
bir öğenin başlangıcında bir konumlandırarak , bir öğeyi okuyarak XElement
ve 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 XmlDocument
hiçbir satır bilgi sağlar iken, XDocument
yapar (aracılığıyla IXmlLineInfo
bir 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 XmlDocument
daha 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.
XDocument
hat bilgilerini sağladığını onaylıyorum . Bkz XDocument.Load ile LoadOptions.SetLineInfo
bir parametre olarak verilir. Eğer hat bilgisi almanın bir yolunu biliyorsanız XmlDocument
merak 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
XmlDocument
XML 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 XPath
düğü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 ).
XDocument
LINQ'dan XML API'sına ve XML XmlDocument
iç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 XmlDocument
ve XNamespace ns + "elementName"
sözdizimi ad alanlarıyla uğraşırken keyifli bir okuma sağlar.
Bahsetmeye değer xsl
ve xpath
dikkat 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 XMLDocument
daha 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
.