সি # তে এক্সএমএল ফাইলগুলি পার্স করার কোনও সহজ পদ্ধতি আছে? তা হলে কী?
সি # তে এক্সএমএল ফাইলগুলি পার্স করার কোনও সহজ পদ্ধতি আছে? তা হলে কী?
উত্তর:
আপনি নেট নেট ৩.৫ বা তার চেয়ে বেশি এর মধ্যে থাকলে আমি এক্সএমএল থেকে লিনকুই ব্যবহার করব
এটা খুবই সাধারণ. আমি জানি এটি স্ট্যান্ডার্ড পদ্ধতি, তবে আরও ভালভাবে মোকাবেলা করার জন্য আপনি নিজের লাইব্রেরি তৈরি করতে পারেন।
এখানে কিছু উদাহরন:
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
কেবল নোডের মানটি ফিরিয়ে দেবেন - যা আমি (এবং সম্ভবত এই প্রশ্নটি পড়ার প্রত্যেকে) প্রথমে সন্ধানের জন্য এক্সএমএলকে বিশ্লেষণ করছি।
Xsd.exe সহ ক্লাসগুলির একটি সেট তৈরি করতে একটি ভাল এক্সএসডি স্কিমা ব্যবহার করুন এবং আপনার এক্সএমএল এবং এর বিপরীতে একটি অবজেক্ট ট্রি তৈরি করতে একটি ব্যবহার করুন । আপনার যদি আপনার মডেলটিতে কিছু বিধিনিষেধ থাকে, আপনি এমনকি আপনার মডেল ক্লাস এবং এক্সএমএল * বৈশিষ্ট্য সহ এক্সএমএল এর মধ্যে সরাসরি ম্যাপিং তৈরি করার চেষ্টা করতে পারেন।XmlSerializer
নেই এক্সএমএল ধারাবাহিকতাতে সম্পর্কে একটি পরিচায়ক নিবন্ধ দুটিই MSDN উপর।
পারফরম্যান্স টিপ: একটি নির্মাণ XmlSerializer
ব্যয়বহুল। XmlSerializer
যদি আপনি একাধিক এক্সএমএল ফাইল বিশ্লেষণ / লেখার ইচ্ছা করে থাকেন তবে আপনার উদাহরণের জন্য একটি রেফারেন্স রাখুন ।
যদি আপনি প্রচুর পরিমাণে ডেটা (অনেকগুলি মেগাবাইট) প্রক্রিয়াকরণ করে থাকেন তবে আপনি XmlReader
এক্সএমএলকে পার্স করার জন্য ব্যবহার করতে চান ।
আর কিছু ( XPathNavigator
, XElement
, XmlDocument
এবং এমনকি XmlSerializer
যদি আপনি সম্পূর্ণ উত্পন্ন বস্তুর গ্রাফ রাখা) পরিণাম ডেকে আনবে উচ্চ মেমোরি ব্যবহার একটি খুব ধীর লোড সময় এবং।
অবশ্যই, যদি যাইহোক আপনার যদি মেমরিতে সমস্ত ডেটা প্রয়োজন হয় তবে আপনার খুব পছন্দ নাও হতে পারে।
ব্যবহারের XmlTextReader
, XmlReader
, XmlNodeReader
এবং System.Xml.XPath
নামস্থান। এবং ( XPathNavigator
, XPathDocument
, XPathExpression
, XPathnodeIterator
)।
সাধারণত XPath
এক্সএমএল পড়া সহজ করে তোলে যা আপনি যা খুঁজছিলেন তা হতে পারে।
new XmlTextReader()
বা new XmlTextWriter()
। নেট .০.০. এর পরে এগুলি হ্রাস করা হয়েছে। ব্যবহার করুন XmlReader.Create()
অথবা XmlWriter.Create()
পরিবর্তে।
এক্সএমএল ডকুমেন্টকে বিশ্লেষণের সাথে জড়িত এমন একটি অ্যাপ্লিকেশন নিয়ে আমার সম্প্রতি কাজ করা দরকার এবং আমি জোন গ্যাল্লোয়ের সাথে একমত যে লিনকু থেকে এক্সএমএল ভিত্তিক পদ্ধতির বিষয়টি আমার মতে, সেরা best তবে ব্যবহারযোগ্য উদাহরণগুলি খুঁজতে আমাকে কিছুটা খনন করতে হয়েছিল, সুতরাং আরও অগ্রগতি ছাড়াই এখানে কয়েকটি দেওয়া হল!
এই কোডটি কার্যকর হিসাবে কোনও মন্তব্য স্বাগত জানায় তবে নিখুঁত হতে পারে না এবং আমি এই প্রকল্পের জন্য এক্সএমএল পার্সিং সম্পর্কে আরও শিখতে চাই!
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");
}
এই ফাংশনগুলির সাথে আমি কোনও এক্সএমএল ফাইল থেকে কোনও উপাদান এবং কোনও বৈশিষ্ট্য পার্স করতে সক্ষম হয়েছি কোনও সমস্যা নেই!
যদি আপনি .NET 2.0 ব্যবহার করেন তবে চেষ্টা করুন XmlReader
এবং এর সাবক্ল্যাস XmlTextReader
, এবং XmlValidatingReader
। তারা একটি এক্সএমএল ফাইল বিশ্লেষণ করার জন্য দ্রুত, লাইটওয়েট (মেমরির ব্যবহার ইত্যাদি) সরবরাহ করে forward
আপনার যদি XPath
সক্ষমতা প্রয়োজন হয় তবে চেষ্টা করুন XPathNavigator
। আপনার যদি প্রয়োজন হয় পুরো ডকুমেন্টটিতে মেমরির চেষ্টা করুন XmlDocument
।
অতিরিক্ত হিসাবে আপনি নিম্নলিখিত পদ্ধতিতে এক্সপ্যাথ নির্বাচনকারী ব্যবহার করতে পারেন (নির্দিষ্ট নোডগুলি নির্বাচন করার সহজ উপায়):
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);
"এক্সএমএল পার্স করার সর্বোত্তম অনুশীলন" বিদ্যমান কিনা তা আমি নিশ্চিত নই। বিভিন্ন পরিস্থিতিতে বিভিন্ন উপযোগী প্রযুক্তি রয়েছে। কোন উপায়টি ব্যবহার করা হবে তা কংক্রিটের দৃশ্যের উপর নির্ভর করে।
তোমার সাথে যেতে পারি এক্সএমএল করার LINQ , XmlReader
, XPathNavigator
বা এমনকি রেগুলার এক্সপ্রেশনের। আপনি যদি আপনার প্রয়োজনগুলি বিস্তারিতভাবে বর্ণনা করেন তবে আমি কিছু পরামর্শ দেওয়ার চেষ্টা করতে পারি।
আপনি এই লাইব্রেরিটি ব্যবহার করে এক্সএমএল বিশ্লেষণ করতে পারেন System.Xml.Linq
। নীচে আমি একটি এক্সএমএল ফাইল বিশ্লেষণ করতে ব্যবহৃত নমুনা কোডটি
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;
}
সিরিয়ালাইজড এবং ডিসরিয়ালাইজ করতে আপনি এক্সটেন্ডেড এক্সএমএলসিরাইজার ব্যবহার করতে পারেন ।
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 এ স্ট্যান্ডার্ড এক্সএমএল সিরিয়ালাইজারটি খুব সীমাবদ্ধ।
এক্সটেন্ডেড এক্সএমএলসিরাইজার এটি এবং আরও অনেক কিছু করতে পারে।
এক্সটেন্ডডএক্সএমএলসিরাইজার সমর্থন। নেট 4.5 বা উচ্চতর এবং। নেট কোর । আপনি এটি WebApi এবং AspCore এর সাথে সংহত করতে পারেন।
আপনি এক্সএমএল ডকুমেন্ট ব্যবহার করতে পারেন এবং এক্সটিএমএল ক্লাসে লিনক করতে পারেন এমন গুণাবলী থেকে ডেটা ম্যানিপুলেট করতে বা পুনরুদ্ধার করতে।