c# एक्सएमएल फाइलों का विश्लेषण कैसे करता है?




xml (10)

सी # में एक्सएमएल फाइलों को पार्स करने का कोई आसान तरीका है? यदि ऐसा है तो क्या?


यदि आप बड़ी मात्रा में डेटा (कई मेगाबाइट्स) संसाधित कर रहे हैं तो आप XML को पार्स करने के लिए XmlReader का उपयोग करना चाहते हैं।

कुछ और ( XPathNavigator , XElement , XmlDocument और यहां तक ​​कि XmlSerializer यदि आप पूर्ण जेनरेट ऑब्जेक्ट ग्राफ़ रखते हैं) परिणामस्वरूप उच्च मेमोरी उपयोग और बहुत धीमी लोड टाइम भी होगी।

बेशक, यदि आपको स्मृति में सभी डेटा की आवश्यकता है, तो आपके पास अधिक विकल्प नहीं हो सकता है।


यदि आप .NET 2.0 का उपयोग कर रहे हैं, तो XmlReader और इसके उप-वर्ग XmlTextReader , और XmlValidatingReader आज़माएं। वे एक तेज, हल्के (स्मृति उपयोग, इत्यादि) प्रदान करते हैं, एक एक्सएमएल फ़ाइल को पार्स करने के लिए आगे-एकमात्र तरीका।

यदि आपको XPath क्षमताओं की आवश्यकता है, तो XPathNavigator आज़माएं। यदि आपको स्मृति में पूरे दस्तावेज़ की आवश्यकता है तो XmlDocument आजमाएं।


xsd.exe साथ कक्षाओं का एक सेट बनाने के लिए एक अच्छी xsd.exe स्कीमा का उपयोग करें और अपने एक्सएमएल से ऑब्जेक्ट ट्री बनाने के लिए XmlSerializer का उपयोग करें और इसके विपरीत। यदि आपके मॉडल पर आपके कुछ प्रतिबंध हैं, तो आप एक्सएमएल * एट्रिब्यूट्स के साथ मॉडल क्लासेस और एक्सएमएल के बीच सीधी मैपिंग भी बनाने का प्रयास कर सकते हैं।

एमएसडीएन पर एक्सएमएल सीरियलाइजेशन के बारे में एक प्रारंभिक लेख है

प्रदर्शन युक्ति: XmlSerializer का निर्माण महंगा है। यदि आप एकाधिक एक्सएमएल फाइलों को पार्स / लिखना चाहते हैं तो अपने XmlSerializer इंस्टेंस का संदर्भ रखें।



आप serialize और deserialize करने के लिए ExtendedXmlSerializer का उपयोग कर सकते हैं।

nuget आप nuget से ExtendedXmlSerializer स्थापित कर सकते हैं या निम्न आदेश चला सकते हैं:

Install-Package ExtendedXmlSerializer

क्रमबद्धता:

ExtendedXmlSerializer serializer = new ExtendedXmlSerializer();
var obj = new Message();
var xml = serializer.Serialize(obj);

deserialization

var obj2 = serializer.Deserialize<Message>(xml);

.NET में मानक एक्सएमएल सीरिएलाइज़र बहुत सीमित है।

  • सर्कुलर संदर्भ या इंटरफ़ेस संपत्ति के साथ कक्षा के साथ कक्षा के serialization का समर्थन नहीं करता है,
  • शब्दकोश का समर्थन नहीं करता है,
  • एक्सएमएल के पुराने संस्करण को पढ़ने के लिए कोई तंत्र नहीं है,
  • यदि आप कस्टम सीरिएलाइज़र बनाना चाहते हैं, तो आपकी कक्षा को IXmlSerializable से प्राप्त होना चाहिए। इसका मतलब है कि आपकी कक्षा एक पीओसीओ कक्षा नहीं होगी,
  • आईओसी का समर्थन नहीं करता है।

ExtendedXmlSerializer यह और भी बहुत कुछ कर सकता है।

ExtendedXmlSerializer समर्थन .NET 4.5 या उच्चतम और .NET कोर । आप इसे WebApi और AspCore के साथ एकीकृत कर सकते हैं।


यदि आप .NET 3.5 या उच्चतर हैं तो मैं LINQ से XML का उपयोग करूंगा।


मुझे हाल ही में एक ऐसे एप्लिकेशन पर काम करने की आवश्यकता है जिसमें एक्सएमएल दस्तावेज़ की पार्सिंग शामिल है और मैं जॉन गैलोवे से सहमत हूं कि LINQ से XML आधारित दृष्टिकोण मेरी राय में सबसे अच्छा है। हालांकि मुझे उपयोग करने योग्य उदाहरण खोजने के लिए थोड़ा खोदना पड़ा, इसलिए आगे के बिना, यहां कुछ हैं!

इस टिप्पणी के रूप में कोई टिप्पणी स्वागत है लेकिन यह सही नहीं हो सकता है और मैं इस परियोजना के लिए XML को पार्स करने के बारे में और जानना चाहता हूं!

public void ParseXML(string filePath)  
{  
    // create document instance using XML file path
    XDocument doc = XDocument.Load(filePath);

    // get the namespace to that within of the XML (xmlns="...")
    XElement root = doc.Root;
    XNamespace ns = root.GetDefaultNamespace();

    // obtain a list of elements with specific tag
    IEnumerable<XElement> elements = from c in doc.Descendants(ns + "exampleTagName") select c;

    // obtain a single element with specific tag (first instance), useful if only expecting one instance of the tag in the target doc
    XElement element = (from c in doc.Descendants(ns + "exampleTagName" select c).First();

    // obtain an element from within an element, same as from doc
    XElement embeddedElement = (from c in element.Descendants(ns + "exampleEmbeddedTagName" select c).First();

    // obtain an attribute from an element
    XAttribute attribute = element.Attribute("exampleAttributeName");
}

इन कार्यों के साथ मैं किसी भी तत्व और किसी XML फ़ाइल से किसी भी विशेषता को पार्स करने में सक्षम था, कोई समस्या नहीं!


यह बहुत सरल है। मुझे पता है कि ये मानक तरीके हैं, लेकिन आप इससे बेहतर निपटने के लिए अपनी खुद की लाइब्रेरी बना सकते हैं।

यहाँ कुछ उदाहरण हैं:

XmlDocument xmlDoc= new XmlDocument(); // Create an XML document object
xmlDoc.Load("yourXMLFile.xml"); // Load the XML document from the specified file

// Get elements
XmlNodeList girlAddress = xmlDoc.GetElementsByTagName("gAddress");
XmlNodeList girlAge = xmlDoc.GetElementsByTagName("gAge"); 
XmlNodeList girlCellPhoneNumber = xmlDoc.GetElementsByTagName("gPhone");

// Display the results
Console.WriteLine("Address: " + girlAddress[0].InnerText);
Console.WriteLine("Age: " + girlAge[0].InnerText);
Console.WriteLine("Phone Number: " + girlCellPhoneNumber[0].InnerText);

इसके अलावा, काम करने के लिए कुछ और तरीके हैं । उदाहरण के लिए, here । और मुझे लगता है कि ऐसा करने के लिए कोई भी सबसे अच्छी विधि नहीं है; आपको हमेशा इसे अपने आप चुनने की ज़रूरत है, जो आपके लिए सबसे उपयुक्त है।


अतिरिक्त में आप XPath चयनकर्ता का निम्न तरीके से उपयोग कर सकते हैं (विशिष्ट नोड्स का चयन करने का आसान तरीका):

XmlDocument doc = new XmlDocument();
doc.Load("test.xml");

var found = doc.DocumentElement.SelectNodes("//book[@title='Barry Poter']"); // select all Book elements in whole dom, with attribute title with value 'Barry Poter'

// Retrieve your data here or change XML here:
foreach (XmlNode book in nodeList)
{
  book.InnerText="The story began as it was...";
}

Console.WriteLine("Display XML:");
doc.Save(Console.Out);

दस्तावेज़ीकरण


आप XmlDocument का उपयोग कर सकते हैं और उन गुणों से डेटा को मैनिपुलेट या पुनर्प्राप्त करने के लिए कर सकते हैं जिन्हें आप एक्सएमएल कक्षाओं में लिंक कर सकते हैं।





xml