কীভাবে একটি এক্সএমএল ফাইল পার্স করে? [বন্ধ]


492

সি # তে এক্সএমএল ফাইলগুলি পার্স করার কোনও সহজ পদ্ধতি আছে? তা হলে কী?


আপনি এই বাস্তবায়নটি ব্যবহার করতে পারেন: stackoverflow.com/a/34813985/5784646
Eulogy

ঠিক আছে, আমি এটি আবার খুললাম। সদৃশটি একটি এক্সএমএল রিডার সমাধান ছিল যেখানে এটি এক্সএমএল ফাইলগুলি বিশ্লেষণের বিষয়ে। Posssible ডুপ্লিকেট প্রশ্ন দেখা যায় সম্পাদন করা ইতিহাস PS @GeorgeStocker
জেরেমি থম্পসন

1
@ জেরেমি থম্পসন কেন এটি নকল ছিল তার একটি কারণ অন্য প্রশ্নের আরও উত্তম উত্তর রয়েছে। সরল "লিঙ্ক কেবল" উত্তর হওয়ায় উপরের উত্তরটি কার্যকর নয়।
জর্জ স্টকার

1
@ জর্জস্টোকার প্রশ্নগুলি সহ-বিদ্যমান থাকার জন্য যথেষ্ট আলাদা এবং উভয়েরই দুর্দান্ত উত্তর রয়েছে, এছাড়াও স্বীকৃতগুলি বিভিন্ন প্রযুক্তি ব্যবহার করছে। এ কারণেই আমি ভোট দিয়েছি যে আমরা এই উন্মুক্ত রেখেছি, আমি জানি এটি গ্রহণযোগ্য একটি কেবল লিংক তবে এটি এমএসডিএন এবং এটি অগ্রহণযোগ্য হওয়ার আগে এমন সময়ে লেখা হয়েছিল, আশা করি পুনরায় খোলার একটি পার্শ্ব প্রতিক্রিয়া জনকে কিছুটা আনন্দিত করবে, তার প্রোফাইলটি পড়ুন । যাইহোক চিয়ার্স।
জেরেমি থম্পসন

উত্তর:



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
XML ডকুমেন্ট উল্লেখ করার জন্য +1, যা কিছু ক্ষেত্রে সিরিয়ালাইজেশন ইন্টারফেসের চেয়ে অনেক বেশি সুবিধাজনক। আপনি যদি একটি নির্দিষ্ট উপাদানের পরে থাকেন তবে আপনি শিশুদের উপাদানগুলি সূচক: এক্সএমএলডোক ["রুট"] দিয়ে অ্যাক্সেস করতে পারবেন এবং এগুলি শৃঙ্খলযুক্ত করা যেতে পারে: xMLDoc ["রুট"] ["ফোল্ডার"] ["আইটেম"] খনন করতে শ্রেণিবিন্যাস (যদিও এই উপাদানগুলি আসলে রয়েছে তা যাচাই করা বুদ্ধিমান)
জেসন উইলিয়ামস

1
InnerTextএখানে সেই নোডের মান পাওয়া যায়, শিশু নোডের সমস্ত মানের সাথে একত্রিত হয় - তাই না? দেখে মনে হচ্ছে একটি বিজোড় জিনিস।
ডন চ্যাডল

17
একজন মহিলা বন্ধুদের তালিকা সহ একটি প্রোগ্রামার? Shenanigans!
ই ভ্যান পুটেন

1
@ E.vanPutten এই দিন এবং যুগে নয়। এটি Nerds এর প্রতিশোধ নয়
ব্যবহারকারী 4052054

@ ডনহেডেল যদি আপনি কোনও শিশু নোড হওয়ার আশা করেন না , তবে InnerTextকেবল নোডের মানটি ফিরিয়ে দেবেন - যা আমি (এবং সম্ভবত এই প্রশ্নটি পড়ার প্রত্যেকে) প্রথমে সন্ধানের জন্য এক্সএমএলকে বিশ্লেষণ করছি।
এফ

48

Xsd.exe সহ ক্লাসগুলির একটি সেট তৈরি করতে একটি ভাল এক্সএসডি স্কিমা ব্যবহার করুন এবং আপনার এক্সএমএল এবং এর বিপরীতে একটি অবজেক্ট ট্রি তৈরি করতে একটি ব্যবহার করুন । আপনার যদি আপনার মডেলটিতে কিছু বিধিনিষেধ থাকে, আপনি এমনকি আপনার মডেল ক্লাস এবং এক্সএমএল * বৈশিষ্ট্য সহ এক্সএমএল এর মধ্যে সরাসরি ম্যাপিং তৈরি করার চেষ্টা করতে পারেন।XmlSerializer

নেই এক্সএমএল ধারাবাহিকতাতে সম্পর্কে একটি পরিচায়ক নিবন্ধ দুটিই MSDN উপর।

পারফরম্যান্স টিপ: একটি নির্মাণ XmlSerializerব্যয়বহুল। XmlSerializerযদি আপনি একাধিক এক্সএমএল ফাইল বিশ্লেষণ / লেখার ইচ্ছা করে থাকেন তবে আপনার উদাহরণের জন্য একটি রেফারেন্স রাখুন ।



5
মাইক্রোসফ্ট থেকে এই উদাহরণের মাঝখানে ভাল উদাহরণ হ'ল "ক্রয় আদেশ উদাহরণ"। msdn.microsoft.com/en-us/library/58a18dwa.aspx । আপনি স্কিমা তৈরি করা এড়াতে পারবেন - আপনার সি # শ্রেণিটি হ'ল স্কিমা, সি # বৈশিষ্ট্যের সাথে সজ্জিত।
লাকাটা

25

যদি আপনি প্রচুর পরিমাণে ডেটা (অনেকগুলি মেগাবাইট) প্রক্রিয়াকরণ করে থাকেন তবে আপনি XmlReaderএক্সএমএলকে পার্স করার জন্য ব্যবহার করতে চান ।

আর কিছু ( XPathNavigator, XElement, XmlDocumentএবং এমনকি XmlSerializerযদি আপনি সম্পূর্ণ উত্পন্ন বস্তুর গ্রাফ রাখা) পরিণাম ডেকে আনবে উচ্চ মেমোরি ব্যবহার একটি খুব ধীর লোড সময় এবং।

অবশ্যই, যদি যাইহোক আপনার যদি মেমরিতে সমস্ত ডেটা প্রয়োজন হয় তবে আপনার খুব পছন্দ নাও হতে পারে।


18

ব্যবহারের XmlTextReader, XmlReader, XmlNodeReaderএবং System.Xml.XPathনামস্থান। এবং ( XPathNavigator, XPathDocument, XPathExpression, XPathnodeIterator)।

সাধারণত XPathএক্সএমএল পড়া সহজ করে তোলে যা আপনি যা খুঁজছিলেন তা হতে পারে।


2
এফওয়াইআই, আপনার ব্যবহার করা উচিত নয় new XmlTextReader()বা new XmlTextWriter()। নেট .০.০. এর পরে এগুলি হ্রাস করা হয়েছে। ব্যবহার করুন XmlReader.Create()অথবা XmlWriter.Create()পরিবর্তে।
জন স্যান্ডার্স

10

এক্সএমএল ডকুমেন্টকে বিশ্লেষণের সাথে জড়িত এমন একটি অ্যাপ্লিকেশন নিয়ে আমার সম্প্রতি কাজ করা দরকার এবং আমি জোন গ্যাল্লোয়ের সাথে একমত যে লিনকু থেকে এক্সএমএল ভিত্তিক পদ্ধতির বিষয়টি আমার মতে, সেরা 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");
}

এই ফাংশনগুলির সাথে আমি কোনও এক্সএমএল ফাইল থেকে কোনও উপাদান এবং কোনও বৈশিষ্ট্য পার্স করতে সক্ষম হয়েছি কোনও সমস্যা নেই!


8

যদি আপনি .NET 2.0 ব্যবহার করেন তবে চেষ্টা করুন XmlReaderএবং এর সাবক্ল্যাস XmlTextReader, এবং XmlValidatingReader। তারা একটি এক্সএমএল ফাইল বিশ্লেষণ করার জন্য দ্রুত, লাইটওয়েট (মেমরির ব্যবহার ইত্যাদি) সরবরাহ করে forward

আপনার যদি XPathসক্ষমতা প্রয়োজন হয় তবে চেষ্টা করুন XPathNavigator। আপনার যদি প্রয়োজন হয় পুরো ডকুমেন্টটিতে মেমরির চেষ্টা করুন XmlDocument


7

অতিরিক্ত হিসাবে আপনি নিম্নলিখিত পদ্ধতিতে এক্সপ্যাথ নির্বাচনকারী ব্যবহার করতে পারেন (নির্দিষ্ট নোডগুলি নির্বাচন করার সহজ উপায়):

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

"এক্সএমএল পার্স করার সর্বোত্তম অনুশীলন" বিদ্যমান কিনা তা আমি নিশ্চিত নই। বিভিন্ন পরিস্থিতিতে বিভিন্ন উপযোগী প্রযুক্তি রয়েছে। কোন উপায়টি ব্যবহার করা হবে তা কংক্রিটের দৃশ্যের উপর নির্ভর করে।

তোমার সাথে যেতে পারি এক্সএমএল করার LINQ , XmlReader, XPathNavigatorবা এমনকি রেগুলার এক্সপ্রেশনের। আপনি যদি আপনার প্রয়োজনগুলি বিস্তারিতভাবে বর্ণনা করেন তবে আমি কিছু পরামর্শ দেওয়ার চেষ্টা করতে পারি।


3
এক্সএমএল এর জন্য রেগেক্স। তুমি দানব.
হবে

3

আপনি এই লাইব্রেরিটি ব্যবহার করে এক্সএমএল বিশ্লেষণ করতে পারেন 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;
}

1

সিরিয়ালাইজড এবং ডিসরিয়ালাইজ করতে আপনি এক্সটেন্ডেড এক্সএমএলসিরাইজার ব্যবহার করতে পারেন ।

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 এর সাথে সংহত করতে পারেন।


1

আপনি এক্সএমএল ডকুমেন্ট ব্যবহার করতে পারেন এবং এক্সটিএমএল ক্লাসে লিনক করতে পারেন এমন গুণাবলী থেকে ডেটা ম্যানিপুলেট করতে বা পুনরুদ্ধার করতে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.