क्या C # में XML फ़ाइलों को पार्स करने की एक सरल विधि है? यदि ऐसा है तो क्या?
क्या C # में XML फ़ाइलों को पार्स करने की एक सरल विधि है? यदि ऐसा है तो क्या?
जवाबों:
यदि आप .NET 3.5 या उच्चतर में हैं तो मैं LINQ से 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);
इसके अलावा, कुछ अन्य तरीकों के साथ काम करना है। उदाहरण के लिए, यहाँ । और मुझे लगता है कि ऐसा करने के लिए कोई सबसे अच्छा तरीका नहीं है; आपको हमेशा इसे अपने आप से चुनने की आवश्यकता है, जो आपके लिए सबसे उपयुक्त है।
InnerText
यहाँ उस नोड का मान मिलता है, जो बच्चे के नोड्स के सभी मूल्यों के साथ समाहित है - सही? चाहने के लिए एक अजीब बात की तरह लगता है।
InnerText
बस नोड मान लौटाएगा - जो कि मैं (और शायद हर कोई इस सवाल को पढ़ रहा है) पहले स्थान पर खोजने के लिए XML को पार्स कर रहा हूं।
Xsd.exe के साथ कक्षाओं का एक सेट बनाने के लिए एक अच्छे XSD स्कीमा का उपयोग करें और अपने XML से बाहर एक ऑब्जेक्ट ट्री बनाने के लिए और इसके विपरीत का उपयोग करें। यदि आपके पास अपने मॉडल पर कुछ प्रतिबंध हैं, तो आप Xml * गुण के साथ मॉडल कक्षाओं और XML के बीच सीधा मानचित्रण बनाने का भी प्रयास कर सकते हैं।XmlSerializer
नहीं है एक्सएमएल क्रमबद्धता के बारे में एक परिचयात्मक लेख MSDN पर।
प्रदर्शन टिप: क का निर्माण XmlSerializer
महंगा है। XmlSerializer
यदि आप पार्स / कई XML फ़ाइलों को लिखने का इरादा रखते हैं तो अपने उदाहरण के लिए एक संदर्भ रखें ।
यदि आप बड़ी मात्रा में डेटा (कई मेगाबाइट) संसाधित कर रहे हैं, तो आप XmlReader
XML को पार्स करने के लिए उपयोग करना चाहते हैं ।
और कुछ ( XPathNavigator
, XElement
, XmlDocument
और यहां तक कि XmlSerializer
अगर आप पूर्ण उत्पन्न वस्तु ग्राफ रखने के लिए) में परिणाम होगा उच्च स्मृति उपयोग एक बहुत ही धीमी गति से लोड समय और भी।
बेशक, अगर आपको मेमोरी में सभी डेटा की आवश्यकता होती है, तो आपके पास ज्यादा विकल्प नहीं हो सकते हैं।
का प्रयोग करें XmlTextReader
, XmlReader
, XmlNodeReader
और System.Xml.XPath
नाम स्थान। और ( XPathNavigator
, XPathDocument
, XPathExpression
, XPathnodeIterator
)।
आमतौर पर XPath
एक्सएमएल को पढ़ना आसान बनाता है, जिसे आप देख रहे होंगे।
new XmlTextReader()
या new XmlTextWriter()
। .NET 2.0 से उन्हें हटा दिया गया है। उपयोग XmlReader.Create()
या XmlWriter.Create()
इसके बजाय।
मुझे अभी हाल ही में एक ऐसे अनुप्रयोग पर काम करने की आवश्यकता है जिसमें एक 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 फ़ाइल से किसी भी विशेषता को पार्स करने में सक्षम था कोई समस्या नहीं है!
यदि आप .NET 2.0 का उपयोग कर रहे हैं, तो कोशिश करें XmlReader
और उसके उपवर्ग XmlTextReader
, औरXmlValidatingReader
। वे एक तेज, हल्का (स्मृति उपयोग, आदि) प्रदान करते हैं, एक XML फ़ाइल पार्स करने के लिए केवल-आगे का रास्ता।
यदि आपको XPath
क्षमताओं की आवश्यकता है, तो प्रयास करें XPathNavigator
। यदि आपको मेमोरी में पूरे दस्तावेज की आवश्यकता है तो प्रयास करें XmlDocument
।
इसके अलावा आप निम्न तरीके से 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);
मुझे यकीन नहीं है कि "XML पार्स करने के लिए सबसे अच्छा अभ्यास" मौजूद है या नहीं। विभिन्न परिस्थितियों के लिए अनुकूल कई प्रौद्योगिकियां हैं। उपयोग करने का कौन सा तरीका कंक्रीट परिदृश्य पर निर्भर करता है।
आप के साथ जा सकते एक्सएमएल के लिए LINQ , XmlReader
, XPathNavigator
या यहाँ तक कि नियमित अभिव्यक्ति। यदि आप अपनी आवश्यकताओं को विस्तृत करते हैं, तो मैं कुछ सुझाव देने का प्रयास कर सकता हूं।
आप इस लाइब्रेरी का उपयोग करके 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;
}
आप 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 बहुत सीमित है।
ExtendedXmlSerializer यह और बहुत कुछ कर सकता है।
ExtendedXmlSerializer .NET 4.5 या उच्चतर और .NET कोर का समर्थन करता है । आप इसे WebApi और AspCore के साथ एकीकृत कर सकते हैं।
आप XmlDocument का उपयोग कर सकते हैं और उन विशेषताओं से डेटा को हेरफेर करने या पुनर्प्राप्त करने के लिए जिनका आप Linq से XML classes में कर सकते हैं।