मैं अब सीख XmlDocumentरहा हूं, लेकिन मैं अभी भाग गया XDocumentहूं और जब मैं उनके अंतर या लाभों को खोजने की कोशिश करता हूं तो मुझे कुछ उपयोगी नहीं मिल सकता है, क्या आप मुझे बता सकते हैं कि आप एक से अधिक का उपयोग क्यों करेंगे?
मैं अब सीख XmlDocumentरहा हूं, लेकिन मैं अभी भाग गया XDocumentहूं और जब मैं उनके अंतर या लाभों को खोजने की कोशिश करता हूं तो मुझे कुछ उपयोगी नहीं मिल सकता है, क्या आप मुझे बता सकते हैं कि आप एक से अधिक का उपयोग क्यों करेंगे?
जवाबों:
आप नेट संस्करण 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उसमें से पढ़ सकते हैं और इसे प्रोसेस कर सकते हैं, फिर अगले तत्व पर जा सकते हैं आदि इस तकनीक के बारे में विभिन्न ब्लॉग पोस्ट हैं, यहाँ एक मुझे एक त्वरित खोज के साथ मिला ।
मैं जवाब में से हैरान कोई भी अब तक इस तथ्य है कि उल्लेख कर रहा हूँ XmlDocumentकोई लाइन में जानकारी प्रदान करता है, जबकि XDocumentकरता है (के माध्यम से IXmlLineInfoइंटरफेस)।
यह कुछ मामलों में एक महत्वपूर्ण विशेषता हो सकती है (उदाहरण के लिए यदि आप किसी XML में त्रुटियों की रिपोर्ट करना चाहते हैं, या जहां तत्व सामान्य रूप से परिभाषित हैं, उन पर नज़र रखें) और इससे पहले कि आप ख़ुशी से इसका उपयोग करना शुरू करें, इससे पहले आपको XmlDocumentबाद में बेहतर तरीके से अवगत कराया जाए। आपको यह सब बदलना होगा।
XDocumentकरता हूं कि लाइन की जानकारी है। देखें XDocument.Load साथ LoadOptions.SetLineInfoएक दूसरे तर्क के रूप में। यदि आप XmlDocumentमेरे साथ उत्सुक होने के लिए लाइन की जानकारी प्राप्त करने का एक तरीका जानते हैं ; वापस जब मैंने यह उत्तर लिखा तो मुझे कोई नहीं मिला। यह अन्य उत्तर पुष्टि करता है: stackoverflow.com/a/33622102/253883
XmlDocumentउन डेवलपर्स के लिए बहुत अच्छा है जो XML DOM ऑब्जेक्ट मॉडल से परिचित हैं। यह थोड़ी देर के लिए आसपास रहा है, और कम या ज्यादा W3C मानक से मेल खाता है। यह मैनुअल नेविगेशन के साथ-साथ XPathनोड चयन का समर्थन करता है ।
XDocument.NET 3.5 में LINQ to XML फीचर को पॉवर। यह का भारी उपयोग करता है IEnumerable<>और सीधे सी # में काम करना आसान हो सकता है।
दोनों दस्तावेज़ मॉडल आपको पूरे दस्तावेज़ को मेमोरी में लोड करने की आवश्यकता है ( XmlReaderउदाहरण के लिए)।
XDocumentLINQ से XML API तक है, और XML के XmlDocumentलिए मानक DOM- शैली API है। यदि आप DOM को अच्छी तरह से जानते हैं, और LINQ to XML नहीं सीखना चाहते हैं, तो साथ चलें XmlDocument। यदि आप दोनों के लिए नए हैं, तो इस पृष्ठ को देखें जो दोनों की तुलना करता है, और जो आपको बेहतर लगता है उसे चुनें।
मैंने अभी-अभी LINQ to XML का उपयोग करना शुरू किया है, और मुझे यह पसंद है कि आप कार्यात्मक निर्माण का उपयोग करके XML दस्तावेज़ बनाते हैं। यह वास्तव में अच्छा है। डोम तुलना में क्लूनी है।
जैसा कि कहीं और उल्लेख किया गया है, निस्संदेह, 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)");
मेरा मानना है कि XDocumentबहुत अधिक वस्तु निर्माण कॉल करता है। मुझे संदेह है कि जब आप बहुत सारे XML दस्तावेज़ों को संभाल रहे हैं, XMLDocumentतो तेज़ हो जाएगा।
ऐसा होने वाला एक स्थान स्कैन डेटा के प्रबंधन में है। कई स्कैन टूल एक्सएमएल (स्पष्ट कारणों के लिए) में अपना डेटा आउटपुट करते हैं। यदि आपको इन स्कैन फ़ाइलों को संसाधित करना है, तो मुझे लगता है कि आपके पास बेहतर प्रदर्शन होगा XMLDocument।