LINQ to XML ve DOM karşılaştırması

Bu makalede, LINQ ile XML arasındaki bazı önemli farklar ve geçerli baskın XML programlama API'si olan W3C Belge Nesne Modeli (DOM) açıklanmaktadır.

XML ağaçları oluşturmanın yeni yolları

W3C DOM'da, aşağıdan yukarıya doğru bir XML ağacı oluşturursunuz; başka bir ifadeyle, bir belge oluşturursunuz, öğeler oluşturursunuz ve sonra da öğeleri belgeye eklersiniz.

Örneğin, aşağıdaki örnek DOM'un XmlDocumentMicrosoft uygulamasını kullanarak xml ağacı oluşturmak için tipik bir yöntem kullanır.

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)

Bu kodlama stili XML ağacının yapısını gizler. LINQ to XML, yapıyı daha iyi gösteren alternatif bir yaklaşım olan işlevsel yapıyı da destekler. Bu yaklaşım ve XAttribute oluşturucularıyla XElement yapılabilir. Visual Basic'te, XML değişmez değerleriyle de yapılabilir. Bu örnekte, işlevsel yapı kullanılarak aynı XML ağacının oluşturulması gösterilmektedir:

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>

XML ağacını oluşturmak için kodu girintilemenin, temel alınan XML'nin yapısını gösterdiğine dikkat edin. Visual Basic sürümü XML değişmez değerlerini kullanır.

Daha fazla bilgi için bkz . XML ağaçları.

DOĞRUDAN XML öğeleriyle çalışma

XML ile program yaparken birincil odağınız genellikle XML öğelerine ve belki de özniteliklere odaklanır. LINQ to XML'de doğrudan XML öğeleri ve öznitelikleriyle çalışabilirsiniz. Örneğin, aşağıdakileri yapabilirsiniz:

  • Belge nesnesi kullanmadan XML öğeleri oluşturun. Bu, XML ağaçlarının parçalarıyla çalışmanız gerektiğinde programlamayı basitleştirir.
  • Nesneleri doğrudan bir XML dosyasından yükleyin T:System.Xml.Linq.XElement .
  • Nesneleri bir dosyaya veya akışa seri hale getirme T:System.Xml.Linq.XElement .

Bunu, XML belgesinin XML ağacı için mantıksal kapsayıcı olarak kullanıldığı W3C DOM ile karşılaştırın. DOM'da, öğeler ve öznitelikler de dahil olmak üzere XML düğümleri bir XML belgesi bağlamında oluşturulmalıdır. DOM'da bir ad öğesi oluşturmak için kod parçası aşağıdadır:

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)

Bir öğeyi birden çok belgede kullanmak istiyorsanız, düğümleri belgeler arasında içeri aktarmanız gerekir. LINQ to XML bu karmaşıklık katmanını önler.

LINQ to XML kullanırken, sınıfı yalnızca belgenin XDocument kök düzeyinde bir açıklama veya işleme yönergesi eklemek istiyorsanız kullanırsınız.

Adların ve ad alanlarının basitleştirilmiş işlenmesi

Adları, ad alanlarını ve ad alanı ön eklerini işlemek genellikle XML programlamanın karmaşık bir parçasıdır. LINQ to XML, ad alanı ön ekleriyle ilgilenme gereksinimini ortadan kaldırarak adları ve ad alanlarını basitleştirir. Ad alanı ön eklerini denetlemek istiyorsanız, bunu yapabilirsiniz. Ancak ad alanı ön eklerini açıkça denetlememeye karar verirseniz, LINQ to XML gerekirse serileştirme sırasında ad alanı ön ekleri atar veya gerekli değilse varsayılan ad alanlarını kullanarak seri hale getirir. Varsayılan ad alanları kullanılırsa, sonuçta elde edilen belgede ad alanı ön ekleri olmaz. Daha fazla bilgi için bkz . Ad alanlarına genel bakış.

DOM ile ilgili bir diğer sorun da düğümün adını değiştirmenize izin vermemesidir. Bunun yerine, yeni bir düğüm oluşturmanız ve tüm alt düğümleri kopyalayıp özgün düğüm kimliğini kaybetmeniz gerekir. LINQ to XML, bir düğümde özelliğini ayarlamanıza XName olanak tanıyarak bu sorunu önler.

XML yüklemek için statik yöntem desteği

LINQ to XML, örnek yöntemleri yerine statik yöntemler kullanarak XML yüklemenize olanak tanır. Bu, yüklemeyi ve ayrıştırma işlemini basitleştirir. Daha fazla bilgi için bkz . Dosyadan XML yükleme.

DTD yapıları için desteğin kaldırılması

LINQ to XML, varlıklar ve varlık başvuruları desteğini kaldırarak XML programlamayı daha da basitleştirir. Varlıkların yönetimi karmaşıktır ve nadiren kullanılır. Desteklerinin kaldırılması performansı artırır ve programlama arabirimini basitleştirir. LINQ to XML ağacı doldurulduğunda, tüm DTD varlıkları genişletilir.

Parçalar için destek

LINQ to XML sınıfı için XmlDocumentFragment eşdeğer bir değer sağlamaz. Ancak çoğu durumda kavram, XmlDocumentFragment veya türünde bir sorgunun sonucuyla IEnumerable<T>IEnumerable<T>XNodeXElementişlenebilir.

XPathNavigator desteği

LINQ to XML, ad alanında System.Xml.XPath uzantı yöntemleri aracılığıyla için XPathNavigator destek sağlar. Daha fazla bilgi için bkz. System.Xml.XPath.Extensions.

Boşluk ve girinti desteği

LINQ to XML, boşluğu DOM'dan daha basit işler.

Yaygın bir senaryo, girintili XML okumak, boşluk metin düğümleri olmadan bellek içi bir XML ağacı oluşturmak (boş alanı korumamak), XML üzerinde bazı işlemler yapmak ve sonra XML'yi girintili olarak kaydetmektir. XML'yi biçimlendirmeyle seri hale getirdiğinizde, XML ağacında yalnızca önemli boşluklar korunur. Bu, LINQ to XML için varsayılan davranıştır.

Bir diğer yaygın senaryo, önceden kasıtlı olarak girintilenmiş XML'yi okumak ve değiştirmektir. Bu girintiyi hiçbir şekilde değiştirmek istemeyebilirsiniz. LINQ to XML'de bunu şu şekilde yapabilirsiniz:

  • XML'yi yüklerken veya ayrıştırırken boşlukları koruma.
  • XML'yi seri hale getirdiğinizde biçimlendirme devre dışı bırakıldığında.

LINQ to XML, DOM'un yaptığı gibi özel Whitespace bir XText düğüm türüne sahip olmak yerine boşluğu düğüm olarak depolar.

Ek açıklamalar için destek

LINQ to XML öğeleri genişletilebilir bir ek açıklama kümesini destekler. Bu, şema bilgileri, öğenin bir kullanıcı arabirimine bağlı olup olmadığı veya uygulamaya özgü başka herhangi bir tür bilgi gibi bir öğe hakkındaki çeşitli bilgileri izlemek için kullanışlıdır. Daha fazla bilgi için bkz . LINQ to XML ek açıklamaları.

Şema bilgileri desteği

LINQ to XML, ad alanında System.Xml.Schema uzantı yöntemleri aracılığıyla XSD doğrulaması için destek sağlar. XML ağacının XSD ile uyumlu olduğunu doğrulayabilirsiniz. XML ağacını şema doğrulama sonrası bilgi kümesi (PSVI) ile doldurabilirsiniz. Daha fazla bilgi için bkz . XSD ve Extensionskullanarak doğrulama.

Ayrıca bkz.