XML फ़ाइलों को पार्स कैसे करता है? [बन्द है]


492

क्या C # में XML फ़ाइलों को पार्स करने की एक सरल विधि है? यदि ऐसा है तो क्या?


आप इस क्रियान्वयन का उपयोग कर सकते हैं: stackoverflow.com/a/34813985/5784646
स्तवन

ठीक है, मैंने इसे फिर से खोल दिया। डुप्लिकेट एक XML रीडर समाधान था जहां यह XML फ़ाइलों को पार्स करने के बारे में है। Posssible डुप्लिकेट सवालों में देखा जा सकता संपादित इतिहास ps @GeorgeStocker
जेरेमी थॉम्पसन

1
@JeremyThompson जिन कारणों से यह डुप्लिकेट था, उनमें से एक कारण यह है कि अन्य प्रश्न का बेहतर उत्तर है। शीर्ष उत्तर एक सरल "केवल लिंक" उत्तर होने के कारण उपयोगी नहीं है।
जॉर्ज स्टॉकर

1
@GeorgeStocker के प्रश्न सह-अस्तित्व में पर्याप्त भिन्न हैं और दोनों के पास शानदार उत्तर हैं, साथ ही स्वीकार किए गए विभिन्न तकनीकों का उपयोग कर रहे हैं। इसीलिए मैंने वोट दिया कि हम इसे खुला छोड़ देते हैं, मुझे पता है कि यह स्वीकार किया गया लिंक केवल एक लिंक है, लेकिन यह MSDN है और एक समय से पहले लिखा गया था कि अस्वीकार्य था, उम्मीद है कि फिर से खोलने का एक साइड इफेक्ट जॉन को थोड़ा खुश कर रहा है, एक प्रोफ़ाइल पढ़ें । वैसे भी चीयर्स।
जेरेमी थॉम्पसन

जवाबों:



314

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

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

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

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


47
XmlDocument का उल्लेख करने के लिए +1, जो कुछ मामलों में क्रमिक इंटरफेस की तुलना में बहुत अधिक सुविधाजनक है। यदि आप एक विशिष्ट तत्व के बाद हैं, तो आप अनुक्रमणिका के साथ बाल तत्वों तक पहुँच सकते हैं: xmlDoc ["रूट"], और ये जंजीर हो सकते हैं: xmlDoc ["रूट"] ["फ़ोल्डर"] ["आइटम"] नीचे खुदाई करने के लिए पदानुक्रम (हालांकि यह इन तत्वों को वास्तव में मान्य करने के लिए समझदार है)
जेसन विलियम्स

1
InnerTextयहाँ उस नोड का मान मिलता है, जो बच्चे के नोड्स के सभी मूल्यों के साथ समाहित है - सही? चाहने के लिए एक अजीब बात की तरह लगता है।
डॉन चीडल

17
महिला मित्रों की सूची के साथ एक प्रोग्रामर? Shenanigans!
ई। वैन पुटीन

1
@ E.vanPutten इस दिन और उम्र में नहीं। यह
नर्ड्स

@DonCheadle यदि आप किसी भी बच्चे के नोड्स होने की उम्मीद नहीं कर रहे हैं, तो InnerTextबस नोड मान लौटाएगा - जो कि मैं (और शायद हर कोई इस सवाल को पढ़ रहा है) पहले स्थान पर खोजने के लिए XML को पार्स कर रहा हूं।
F1Krazy

48

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

नहीं है एक्सएमएल क्रमबद्धता के बारे में एक परिचयात्मक लेख MSDN पर।

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



5
इस उदाहरण के बीच में Microsoft से "खरीद आदेश उदाहरण" अच्छा उदाहरण है। msdn.microsoft.com/en-us/library/58a18dwa.aspx । आप स्कीमा बनाने से बचते हैं - आपका सी # वर्ग स्कीमा है, जो सी # विशेषताओं से सजी है।
निशान लता

25

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

और कुछ ( XPathNavigator, XElement, XmlDocumentऔर यहां तक कि XmlSerializerअगर आप पूर्ण उत्पन्न वस्तु ग्राफ रखने के लिए) में परिणाम होगा उच्च स्मृति उपयोग एक बहुत ही धीमी गति से लोड समय और भी।

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


18

का प्रयोग करें XmlTextReader, XmlReader, XmlNodeReaderऔर System.Xml.XPathनाम स्थान। और ( XPathNavigator, XPathDocument, XPathExpression, XPathnodeIterator)।

आमतौर पर XPathएक्सएमएल को पढ़ना आसान बनाता है, जिसे आप देख रहे होंगे।


2
FYI करें, आपको उपयोग नहीं करना चाहिए new XmlTextReader()या new XmlTextWriter()। .NET 2.0 से उन्हें हटा दिया गया है। उपयोग XmlReader.Create()या XmlWriter.Create()इसके बजाय।
जॉन सॉन्डर्स

10

मुझे अभी हाल ही में एक ऐसे अनुप्रयोग पर काम करने की आवश्यकता है जिसमें एक XML दस्तावेज़ का पार्सिंग शामिल था और मैं जॉन गैलोवे से सहमत हूं कि LINQ to 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 फ़ाइल से किसी भी विशेषता को पार्स करने में सक्षम था कोई समस्या नहीं है!


8

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

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


7

इसके अलावा आप निम्न तरीके से 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);

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


6

मुझे यकीन नहीं है कि "XML पार्स करने के लिए सबसे अच्छा अभ्यास" मौजूद है या नहीं। विभिन्न परिस्थितियों के लिए अनुकूल कई प्रौद्योगिकियां हैं। उपयोग करने का कौन सा तरीका कंक्रीट परिदृश्य पर निर्भर करता है।

आप के साथ जा सकते एक्सएमएल के लिए LINQ , XmlReader, XPathNavigatorया यहाँ तक कि नियमित अभिव्यक्ति। यदि आप अपनी आवश्यकताओं को विस्तृत करते हैं, तो मैं कुछ सुझाव देने का प्रयास कर सकता हूं।


3
xml के लिए regex। राक्षस।
होगा

3

आप इस लाइब्रेरी का उपयोग करके XML को पार्स कर सकते हैं System.Xml.Linq। नीचे एक नमूना कोड है जो मैंने XML फ़ाइल को पार्स करने के लिए उपयोग किया था

public CatSubCatList GenerateCategoryListFromProductFeedXML()
{
    string path = System.Web.HttpContext.Current.Server.MapPath(_xmlFilePath);

    XDocument xDoc = XDocument.Load(path);

    XElement xElement = XElement.Parse(xDoc.ToString());


    List<Category> lstCategory = xElement.Elements("Product").Select(d => new Category
    {
        Code = Convert.ToString(d.Element("CategoryCode").Value),
        CategoryPath = d.Element("CategoryPath").Value,
        Name = GetCateOrSubCategory(d.Element("CategoryPath").Value, 0), // Category
        SubCategoryName = GetCateOrSubCategory(d.Element("CategoryPath").Value, 1) // Sub Category
    }).GroupBy(x => new { x.Code, x.SubCategoryName }).Select(x => x.First()).ToList();

    CatSubCatList catSubCatList = GetFinalCategoryListFromXML(lstCategory);

    return catSubCatList;
}

1

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

Instalation आप से ExtendedXmlSerializer स्थापित कर सकते हैं nuget या निम्नलिखित कमांड चलाएँ:

Install-Package ExtendedXmlSerializer

क्रमबद्धता:

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

deserialization

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

.NET में Standard XML Serializer बहुत सीमित है।

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

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

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


1

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.