मैं अब सीख XmlDocument
रहा हूं, लेकिन मैं अभी भाग गया XDocument
हूं और जब मैं उनके अंतर या लाभों को खोजने की कोशिश करता हूं तो मुझे कुछ उपयोगी नहीं मिल सकता है, क्या आप मुझे बता सकते हैं कि आप एक से अधिक का उपयोग क्यों करेंगे?
मैं अब सीख XmlDocument
रहा हूं, लेकिन मैं अभी भाग गया XDocument
हूं और जब मैं उनके अंतर या लाभों को खोजने की कोशिश करता हूं तो मुझे कुछ उपयोगी नहीं मिल सकता है, क्या आप मुझे बता सकते हैं कि आप एक से अधिक का उपयोग क्यों करेंगे?
जवाबों:
आप नेट संस्करण 3.0 का उपयोग कर या कम कर रहे हैं, तो आप है उपयोग करने के लिए XmlDocument
उर्फ क्लासिक डोम एपीआई। इसी तरह आप पाएंगे कि कुछ अन्य एपीआई भी हैं जो इसकी उम्मीद करेंगे।
यदि आपको विकल्प मिलता है, तो, मैं XDocument
XML के लिए उर्फ 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
उदाहरण के लिए)।
XDocument
LINQ से 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.0
Linq 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
।