XDocument या XmlDocument


501

मैं अब सीख XmlDocumentरहा हूं, लेकिन मैं अभी भाग गया XDocumentहूं और जब मैं उनके अंतर या लाभों को खोजने की कोशिश करता हूं तो मुझे कुछ उपयोगी नहीं मिल सकता है, क्या आप मुझे बता सकते हैं कि आप एक से अधिक का उपयोग क्यों करेंगे?


13
मैं सोच रहा था कि Microsoft में प्रलेखन लोगों ने अपने अंतर को स्पष्ट करने के लिए या क्या उपयोग करने के लिए MSDN में कोई नोट या टिप्पणी नहीं दी।
कामरान बिगडेल

1
Msdn पर कुछ जानकारी: msdn.microsoft.com/en-us/library/… । और एक प्रदर्शन सवाल: stackoverflow.com/questions/4383919/… । व्यक्तिगत रूप से मैंने LINQ से XML के साथ काम करना आसान पाया है।
नवफाल

जवाबों:


500

आप नेट संस्करण 3.0 का उपयोग कर या कम कर रहे हैं, तो आप है उपयोग करने के लिए XmlDocumentउर्फ क्लासिक डोम एपीआई। इसी तरह आप पाएंगे कि कुछ अन्य एपीआई भी हैं जो इसकी उम्मीद करेंगे।

यदि आपको विकल्प मिलता है, तो, मैं XDocumentXML के लिए उर्फ ​​LINQ का उपयोग करने की सलाह दूंगा। यह बहुत दस्तावेज़ बनाने और उन्हें कार्रवाई करने के लिए सरल। उदाहरण के लिए, इसके बीच का अंतर है:

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);

तथा

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

Namespaces, LINQ से XML में काम करना बहुत आसान है, किसी भी अन्य XML API के विपरीत जो मैंने कभी देखा है:

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

LINQ to XML भी LINQ के साथ वास्तव में अच्छी तरह से काम करता है - इसका निर्माण मॉडल आपको उप-तत्वों के अनुक्रमों के साथ तत्वों का निर्माण करने की अनुमति देता है:

// 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
    ));

यह सब बहुत अधिक घोषणात्मक है, जो सामान्य LINQ शैली के साथ फिट बैठता है।

अब जैसा कि ब्रैंथॉन ने उल्लेख किया है, ये स्ट्रीमिंग एपीआई के बजाय इन-मेमोरी एपीआई हैं (हालांकि XStreamingElementआलसी आउटपुट का समर्थन करता है)। XmlReaderऔर XmlWriter.NET में XML स्ट्रीमिंग के सामान्य तरीके हैं, लेकिन आप सभी एपीआई को कुछ हद तक मिला सकते हैं। उदाहरण के लिए, आप एक बड़े दस्तावेज़ को स्ट्रीम कर सकते हैं लेकिन XmlReaderकिसी तत्व के शुरू में पोज़िशनिंग से LINQ से XML तक का उपयोग कर सकते हैं , XElementउसमें से पढ़ सकते हैं और इसे प्रोसेस कर सकते हैं, फिर अगले तत्व पर जा सकते हैं आदि इस तकनीक के बारे में विभिन्न ब्लॉग पोस्ट हैं, यहाँ एक मुझे एक त्वरित खोज के साथ मिला


क्या आप मुझे बता सकते हैं कि वे अलग क्यों हैं? मेरा मतलब है कि हाँ XDocument बहुत साफ दिखता है लेकिन DOM स्तर के अंतर के रूप में, वे दोनों xml नहीं हैं, क्या कोई ऐसी योजना है जो Microsoft X-DOM और W3C दोनों प्रकार के DOM दिखाती है? धन्यवाद।
तारिक

3
"स्कीम" से आपका क्या मतलब है और "शो" से आपका क्या मतलब है? हां, वे दोनों मानक XML के साथ काम करते हैं, लेकिन LINQ to XML ज्यादातर चीजों के लिए केवल एक अच्छा एपीआई है। LINQ से XML के पीछे बहुत सारी तकनीक बस .NET 3.5 से पहले उपलब्ध नहीं थी।
जॉन स्कीट

मेरा मतलब है कि क्या उनके दस्तावेज़ ऑब्जेक्ट मॉडल अलग हैं?
तारिक

6
वैसे वे दोनों ही XML के लिए एपीआई हैं, इस लिहाज से वे अलग नहीं हैं। मुझे संदेह है कि दोनों की कुछ सीमाएँ हैं (और XML के लिए एक LINQ है जिसके बारे में मुझे पता है, लेकिन मेरे सिर के शीर्ष को याद नहीं कर सकते हैं) लेकिन ज्यादातर मामलों में आप उन्हें थोड़े अलग अभ्यावेदन के साथ एक ही मॉडल होने का इलाज कर सकते हैं।
जॉन स्कीट

1
@SensorSmith: यह हालांकि अन्य सभी बोनस को कवर नहीं करता है, जैसे अनुक्रमों का स्वत: समतल करना, दिनांक समय से निपटना आदि। आप सभी के लिए एक्सटेंशन विधियां भी जोड़ सकते हैं, लेकिन LINQ को XML में फिर से कैसे मजबूत करें जब आप इसे इसके बजाय इस्तेमाल कर सकते हैं?
जॉन स्कीट

57

मैं जवाब में से हैरान कोई भी अब तक इस तथ्य है कि उल्लेख कर रहा हूँ XmlDocumentकोई लाइन में जानकारी प्रदान करता है, जबकि XDocumentकरता है (के माध्यम से IXmlLineInfoइंटरफेस)।

यह कुछ मामलों में एक महत्वपूर्ण विशेषता हो सकती है (उदाहरण के लिए यदि आप किसी XML में त्रुटियों की रिपोर्ट करना चाहते हैं, या जहां तत्व सामान्य रूप से परिभाषित हैं, उन पर नज़र रखें) और इससे पहले कि आप ख़ुशी से इसका उपयोग करना शुरू करें, इससे पहले आपको XmlDocumentबाद में बेहतर तरीके से अवगत कराया जाए। आपको यह सब बदलना होगा।


1
और मुझे आश्चर्य है कि किसी ने भी यह नहीं देखा कि आपका कथन एकदम सही है। XmlDocument नहीं करता है जबकि XDocument नहीं करता है लाइन जानकारी प्रदान करता है।
VVS

4
@ वीवीएस: आपने मुझे एक पल के लिए चिंतित कर दिया था कि मैंने एक भयानक टाइपो बनाया था, लेकिन दोहरी जांच के बाद, मैं पुष्टि XDocumentकरता हूं कि लाइन की जानकारी है। देखें XDocument.Load साथ LoadOptions.SetLineInfoएक दूसरे तर्क के रूप में। यदि आप XmlDocumentमेरे साथ उत्सुक होने के लिए लाइन की जानकारी प्राप्त करने का एक तरीका जानते हैं ; वापस जब मैंने यह उत्तर लिखा तो मुझे कोई नहीं मिला। यह अन्य उत्तर पुष्टि करता है: stackoverflow.com/a/33622102/253883
Julien Guertault

1
"और आप बेहतर तरीके से इसके बारे में जानते हैं इससे पहले कि आप खुशी से XmlDocument का उपयोग करना शुरू कर दें, बाद में पता चलता है कि आपको सभी को बदलना होगा।" लगता है कि मैंने अभी क्या किया :)
पॉल

36

XmlDocumentउन डेवलपर्स के लिए बहुत अच्छा है जो XML DOM ऑब्जेक्ट मॉडल से परिचित हैं। यह थोड़ी देर के लिए आसपास रहा है, और कम या ज्यादा W3C मानक से मेल खाता है। यह मैनुअल नेविगेशन के साथ-साथ XPathनोड चयन का समर्थन करता है ।

XDocument.NET 3.5 में LINQ to XML फीचर को पॉवर। यह का भारी उपयोग करता है IEnumerable<>और सीधे सी # में काम करना आसान हो सकता है।

दोनों दस्तावेज़ मॉडल आपको पूरे दस्तावेज़ को मेमोरी में लोड करने की आवश्यकता है ( XmlReaderउदाहरण के लिए)।


3
मुझे लगता है कि आपका मतलब था "और सीधे VB.net में काम करना आसान हो सकता है"। क्योंकि VB उन तत्वों के प्रत्यक्ष निर्माण का समर्थन करता है जहां C # को अभी भी कोड की आवश्यकता है।
ब्रेन 20

24

XDocumentLINQ से XML API तक है, और XML के XmlDocumentलिए मानक DOM- शैली API है। यदि आप DOM को अच्छी तरह से जानते हैं, और LINQ to XML नहीं सीखना चाहते हैं, तो साथ चलें XmlDocument। यदि आप दोनों के लिए नए हैं, तो इस पृष्ठ को देखें जो दोनों की तुलना करता है, और जो आपको बेहतर लगता है उसे चुनें।

मैंने अभी-अभी LINQ to XML का उपयोग करना शुरू किया है, और मुझे यह पसंद है कि आप कार्यात्मक निर्माण का उपयोग करके XML दस्तावेज़ बनाते हैं। यह वास्तव में अच्छा है। डोम तुलना में क्लूनी है।


23

जैसा कि कहीं और उल्लेख किया गया है, निस्संदेह, Linq to Xml निर्माण और xml दस्तावेज़ों की तुलना में एक हवा का परिवर्तन करता है XmlDocument, और XNamespace ns + "elementName"सिनेमैक्स नामस्थान के साथ काम करते समय सुखद पढ़ने के लिए बनाता है।

एक बात xslऔर xpathध्यान देने योग्य है कि मरने के लिए कष्टदायक बात यह है कि यह अभी भी संभव है कि xpath 1.0Linq 2 X2 पर मनमाने ढंग से भावों को निष्पादित करें XNodes:

using System.Xml.XPath;

और फिर हम xpathइन विस्तार विधियों के माध्यम से डेटा को नेविगेट और प्रोजेक्ट कर सकते हैं :

उदाहरण के लिए, 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>

हम मूल्यांकन कर सकते हैं:

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)");

14

इसके अलावा, ध्यान दें कि XDocumentXbox 360 और Windows Phone OS 7.0 में समर्थित है। यदि आप उन्हें निशाना बनाते हैं, तो विकास करें XDocumentया वहां से पलायन करें XmlDocument


-8

मेरा मानना ​​है कि XDocumentबहुत अधिक वस्तु निर्माण कॉल करता है। मुझे संदेह है कि जब आप बहुत सारे XML दस्तावेज़ों को संभाल रहे हैं, XMLDocumentतो तेज़ हो जाएगा।

ऐसा होने वाला एक स्थान स्कैन डेटा के प्रबंधन में है। कई स्कैन टूल एक्सएमएल (स्पष्ट कारणों के लिए) में अपना डेटा आउटपुट करते हैं। यदि आपको इन स्कैन फ़ाइलों को संसाधित करना है, तो मुझे लगता है कि आपके पास बेहतर प्रदर्शन होगा XMLDocument


11
मुझे लगता है कि आपको अगली बार आंकड़ों के साथ अपनी टिप्पणी वापस देनी चाहिए, क्योंकि मेरा मानना ​​है कि आप गलत हो सकते हैं। ब्लॉगs.msdn.com/b/codejunkie/archive/2008/10/08/… पर
mike
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.