সি # 2.0 তে এক্সএমএল ডকুমেন্টস, এক্সএসডি ইত্যাদি মোকাবিলার সর্বোত্তম উপায় কী?
কোন ক্লাসগুলি ব্যবহার করতে হবে ইত্যাদি। এক্সএমএল নথিগুলি বিশ্লেষণ এবং তৈরি করার সর্বোত্তম অনুশীলনগুলি কী are
সম্পাদনা:। নেট 3.5 পরামর্শ এছাড়াও স্বাগত।
সি # 2.0 তে এক্সএমএল ডকুমেন্টস, এক্সএসডি ইত্যাদি মোকাবিলার সর্বোত্তম উপায় কী?
কোন ক্লাসগুলি ব্যবহার করতে হবে ইত্যাদি। এক্সএমএল নথিগুলি বিশ্লেষণ এবং তৈরি করার সর্বোত্তম অনুশীলনগুলি কী are
সম্পাদনা:। নেট 3.5 পরামর্শ এছাড়াও স্বাগত।
উত্তর:
সি # ২.০ এ পঠন এবং লেখার প্রাথমিক মাধ্যমগুলি এক্সএমএল ডকুমেন্ট শ্রেণীর মাধ্যমে সম্পন্ন হয় । আপনি নিজের বেশিরভাগ সেটিংস সরাসরি এক্সএমএল ডকুমেন্টে এটি XMLReader গ্রহণ করে লোড করতে পারেন।
XmlDocument document = new XmlDocument();
document.LoadXml("<People><Person Name='Nick' /><Person Name='Joe' /></People>");
XmlDocument document = new XmlDocument();
document.Load(@"C:\Path\To\xmldoc.xml");
// Or using an XmlReader/XmlTextReader
XmlReader reader = XmlReader.Create(@"C:\Path\To\xmldoc.xml");
document.Load(reader);
এক্সপিথ ব্যবহার করে আমি এক্সএমএল ডকুমেন্টটি পড়ার সবচেয়ে সহজ / দ্রুততম উপায়টি খুঁজে পাই।
XmlDocument document = new XmlDocument();
document.LoadXml("<People><Person Name='Nick' /><Person Name='Joe' /></People>");
// Select a single node
XmlNode node = document.SelectSingleNode("/People/Person[@Name = 'Nick']");
// Select a list of nodes
XmlNodeList nodes = document.SelectNodes("/People/Person");
এক্সএমএল নথি যাচাই করতে আপনার যদি এক্সএসডি ডকুমেন্টগুলির সাথে কাজ করার দরকার হয় তবে আপনি এটি ব্যবহার করতে পারেন।
XmlReaderSettings settings = new XmlReaderSettings();
settings.ValidateType = ValidationType.Schema;
settings.Schemas.Add("", pathToXsd); // targetNamespace, pathToXsd
XmlReader reader = XmlReader.Create(pathToXml, settings);
XmlDocument document = new XmlDocument();
try {
document.Load(reader);
} catch (XmlSchemaValidationException ex) { Trace.WriteLine(ex.Message); }
XmlReaderSettings settings = new XmlReaderSettings();
settings.ValidateType = ValidationType.Schema;
settings.Schemas.Add("", pathToXsd); // targetNamespace, pathToXsd
settings.ValidationEventHandler += new ValidationEventHandler(settings_ValidationEventHandler);
XmlReader reader = XmlReader.Create(pathToXml, settings);
while (reader.Read()) { }
private void settings_ValidationEventHandler(object sender, ValidationEventArgs args)
{
// e.Message, e.Severity (warning, error), e.Error
// or you can access the reader if you have access to it
// reader.LineNumber, reader.LinePosition.. etc
}
XmlWriter writer = XmlWriter.Create(pathToOutput);
writer.WriteStartDocument();
writer.WriteStartElement("People");
writer.WriteStartElement("Person");
writer.WriteAttributeString("Name", "Nick");
writer.WriteEndElement();
writer.WriteStartElement("Person");
writer.WriteStartAttribute("Name");
writer.WriteValue("Nick");
writer.WriteEndAttribute();
writer.WriteEndElement();
writer.WriteEndElement();
writer.WriteEndDocument();
writer.Flush();
(আপডেট 1)
.NET 3.5 এ, আপনি অনুরূপ কাজ সম্পাদনের জন্য এক্সডোকামেন্ট ব্যবহার করেন। তবে পার্থক্যটি হ'ল আপনার প্রয়োজনীয় তথ্যটি নির্বাচন করতে আপনার লিনক ক্যোয়ারীগুলি সম্পাদন করার সুবিধা রয়েছে। অবজেক্ট ইনিশিয়ালাইজার যুক্ত করার সাথে সাথে আপনি এমন একটি ক্যোয়ারী তৈরি করতে পারেন যা এমনকি আপনার নিজের সংজ্ঞায়িত অবজেক্টগুলিকে ক্যোয়ারীতে ডানদিকে ফেরত দেয়।
XDocument doc = XDocument.Load(pathToXml);
List<Person> people = (from xnode in doc.Element("People").Elements("Person")
select new Person
{
Name = xnode.Attribute("Name").Value
}).ToList();
(আপডেট 2)
.NET 3.5 এর একটি দুর্দান্ত উপায় XML তৈরি করতে এক্সডোকামেন্ট ব্যবহার করা নীচে রয়েছে। এটি কোড পছন্দসই আউটপুট অনুরূপ প্যাটার্ন প্রদর্শিত হবে।
XDocument doc =
new XDocument(
new XDeclaration("1.0", Encoding.UTF8.HeaderName, String.Empty),
new XComment("Xml Document"),
new XElement("catalog",
new XElement("book", new XAttribute("id", "bk001"),
new XElement("title", "Book Title")
)
)
);
সৃষ্টি করে
<!--Xml Document-->
<catalog>
<book id="bk001">
<title>Book Title</title>
</book>
</catalog>
অন্য সব ব্যর্থ, আপনি এই এমএসডিএন নিবন্ধটি যাচাই করতে পারেন যার অনেক উদাহরণ রয়েছে যা আমি এখানে এবং আরও বেশি আলোচনা করেছি। http://msdn.microsoft.com/en-us/library/aa468556.aspx
এটি আকারের উপর নির্ভর করে; ছোট থেকে মাঝের আকারের এক্সএমএল এর জন্য একটি ডিওএম যেমন এক্সএমএল ডকুমেন্ট (যে কোনও সি # /। নেট সংস্করণ) বা এক্সডোকামেন্ট (। নেট 3.5 / সি # 3.0) স্পষ্ট বিজয়ী। Xsd ব্যবহার, আপনি XML একটি ব্যবহার লোড করতে XmlReader , এবং একটি XmlReader (থেকে স্বীকার তৈরি করুন ) একজন XmlReaderSettings । XmlReaderSettings বস্তু টি স্কীমাস সম্পত্তি যে xsd (অথবা DTD) বৈধতা সম্পাদন করতে ব্যবহার করা যাবে।
এক্সএমএল লেখার জন্য, একই জিনিসগুলি প্রযোজ্য, লিংক-টু-এক্সএমএল (এক্সডোকামেন্ট) এর সাথে পুরানো এক্সএমএল ডকুমেন্টের চেয়ে কন্টেন্ট স্থাপন করা কিছুটা সহজ not
তবে বিশাল এক্সএমএল-এর জন্য একটি ডিওএম খুব বেশি মেমরি ছড়িয়ে দিতে পারে, সেক্ষেত্রে আপনাকে সরাসরি এক্সএমএলআরডার / এক্সএমএল রাইটার ব্যবহার করতে হবে।
অবশেষে, এক্সএমএলকে ম্যানিপুলেট করার জন্য আপনি XslCompiledTransfor (একটি এক্সএসল্ট স্তর) ব্যবহার করতে চাইতে পারেন wish
এক্সএমএল নিয়ে কাজ করার বিকল্পটি কোনও অবজেক্ট মডেলের সাথে কাজ করা; আপনি xsd.exe ব্যবহার করে এমন ক্লাস তৈরি করতে পারবেন যা কোনও এক্সএসডি-কমপ্লায়েন্ট মডেলকে উপস্থাপন করে এবং এক্সএমএলকে অবজেক্ট হিসাবে লোড করে , ওও দিয়ে চালিত করতে এবং তারপরে আবার সেই বস্তুগুলিকে সিরিয়ালাইজ করতে পারে; আপনি এটি এক্সএমএলসিরাইজারের সাহায্যে করেন ।
nyxtom এর উত্তর খুব ভাল। আমি এতে কয়েকটি জিনিস যুক্ত করব:
আপনার যদি কোনও এক্সএমএল ডকুমেন্টে কেবলমাত্র পঠনযোগ্য অ্যাক্সেসের প্রয়োজন হয় তবে XPathDocument
এটি তার চেয়ে অনেক বেশি হালকা ওজনের বস্তু XmlDocument
।
ব্যবহারের খারাপ দিকটি XPathDocument
হল আপনি পরিচিত SelectNodes
এবং SelectSingleNode
পদ্ধতিগুলি ব্যবহার করতে পারবেন না XmlNode
। পরিবর্তে, আপনাকে যে সরঞ্জামগুলি সরবরাহ করে সেগুলি IXPathNavigable
ব্যবহার CreateNavigator
করতে হবে : একটি তৈরি করতে XPathNavigator
ব্যবহার করুন XPathNavigator
এবং XPathNodeIterator
এক্সপ্যাথের মাধ্যমে আপনি যে নোডগুলি খুঁজে পান তার তালিকাগুলির পুনরাবৃত্তি করতে এস তৈরি করতে ব্যবহার করুন । এটির জন্য সাধারণত XmlDocument
পদ্ধতির তুলনায় কোডের আরও কয়েকটি লাইন প্রয়োজন ।
তবে: XmlDocument
এবং XmlNode
ক্লাসগুলি বাস্তবায়িত হয় IXPathNavigable
, সুতরাং যে কোনও কোড আপনি এই পদ্ধতিতে ব্যবহার করতে লিখেন XPathDocument
সেগুলিও একটিতে কাজ করে XmlDocument
। আপনি যদি লেখার বিরুদ্ধে লিখতে অভ্যস্ত হন তবে IXPathNavigable
আপনার পদ্ধতিগুলি যে কোনও একটি বস্তুর বিরুদ্ধে কাজ করতে পারে। (এই কারণেই ব্যবহার করে XmlNode
এবং XmlDocument
পদ্ধতিতে স্বাক্ষরগুলি এফএক্সকপ দ্বারা চিহ্নিত করা হয়।)
বিলাপজনকভাবে, XDocument
এবং XElement
(এবং XNode
এবং XObject
) প্রয়োগ করে না IXPathNavigable
।
আরেকটা জিনিস nyxtom এর উত্তরে উপস্থিত নেই XmlReader
। আপনি সাধারণত XmlReader
প্রসেস শুরু করার আগে এক্সএমএল স্ট্রিমটিকে কোনও অবজেক্ট মডেলে পার্সিংয়ের ওভারহেড এড়াতে ব্যবহার করেন । পরিবর্তে, আপনি XmlReader
ইনপুট স্ট্রিমটি একবারে একটি এক্সএমএল নোড প্রক্রিয়া করতে একটি ব্যবহার করেন। এটি মূলত। SAX এর জন্য নেট এর উত্তর। এটি আপনাকে খুব বড় এক্সএমএল ডকুমেন্টগুলি প্রক্রিয়াকরণের জন্য খুব দ্রুত কোড লিখতে দেয়।
XmlReader
এক্সএমএল ডকুমেন্টের টুকরো প্রক্রিয়াকরণের সহজতম উপায়ও সরবরাহ করে, যেমন এসএমএল সার্ভারের জন্য এক্সএমএল র জন্য বিকল্পটি প্রত্যাবর্তন করে এমন কোনও অন্তর্ভুক্ত উপাদান ছাড়াই এক্সএমএল উপাদানগুলির প্রবাহ।
আপনি যে কোডটি ব্যবহার করে লিখছেন XmlReader
সেটি সাধারণভাবে খুব শক্তভাবে এটি এক্সএমএল পড়ার বিন্যাসে মিলিত হয়। এক্সপথ ব্যবহার করা আপনার কোডকে অনেক বেশি, খুব বেশি আলগাভাবে এক্সএমএলে মিলিত হতে দেয়, এজন্যই এটি সাধারণত সঠিক উত্তর হয়। তবে যখন আপনার ব্যবহারের XmlReader
প্রয়োজন হবে তখন আপনার সত্যই এটি প্রয়োজন।
XPathNavigator CreateNavigator(this XNode node)
একটি XPathNavigator
থেকে তৈরি করার জন্য একটি এক্সটেনশন পদ্ধতি XNode
রয়েছে (এতে উত্পন্ন শ্রেণিটি রয়েছে XDocument
)।
প্রথমত, নতুন এক্সডোকামেন্ট এবং এক্সলেমেন্ট ক্লাসগুলি জানুন , কারণ তারা আগের এক্সএমএল ডকুমেন্ট পরিবারের তুলনায় উন্নতি।
তবে , লেগ্যাসি কোড - বিশেষত পূর্বে উত্পন্ন উত্সগুলি নিয়ে কাজ করতে আপনাকে এখনও পুরানো শ্রেণিগুলি ব্যবহার করতে হতে পারে। সেক্ষেত্রে এই এক্সএমএল-হ্যান্ডলিং ক্লাসগুলির মধ্যে আন্তঃসংযোগ স্থাপনের জন্য আপনাকে কিছু নিদর্শনগুলির সাথে পরিচিত হতে হবে।
আমি মনে করি আপনার প্রশ্নটি বেশ বিস্তৃত, এবং বিবরণ দেওয়ার জন্য একটি একক উত্তরের খুব বেশি প্রয়োজন, তবে এটি আমি প্রথম সাধারণ উত্তর যা ভেবেছিলাম এবং এটি একটি সূচনা হিসাবে কাজ করে।
101 লিঙ্ক নমুনা
http://msdn.microsoft.com/en-us/library/bb387098.aspx
এবং লিনক থেকে এক্সএমএল নমুনা
http://msdn.microsoft.com/en-us/vbasic/bb688087.aspx
এবং আমি মনে করি লিঙ্ক এক্সএমএলকে সহজ করে তোলে।
আপনি .NET 3.5 এ কাজ করছেন এবং আপনি পরীক্ষামূলক কোড সম্পর্কে ভীত না হয়ে থাকলে আপনি লিনিকউ থেকে এক্সএসডি পরীক্ষা করতে পারেন ( http://blogs.msdn.com/xMLteam/archive/2008/02/21/linq-to- xsd-alpha-0-2.aspx ) যা XSD থেকে এক্স নেট থেকে ক্লাস জেনারেট করে ( এক্সএসডি থেকে নিয়মে অন্তর্ভুক্ত)।
এরপরে এটি কোনও ফাইলকে সরাসরি লিখতে এবং XSD বিধি মেনে চলে তা নিশ্চিত করে কোনও ফাইল থেকে পড়ার ক্ষমতা রাখে।
আপনার সাথে কাজ করা কোনও এক্সএমএল ডকুমেন্টের জন্য আমি অবশ্যই এক্সএসডি থাকার পরামর্শ দিচ্ছি:
আমি দেখতে পেলাম যে লিকুইড এক্সএমএল স্টুডিও এক্সএসডি তৈরির জন্য দুর্দান্ত সরঞ্জাম এবং এটি বিনামূল্যে!
এক্সএমএল ডকুমেন্ট ক্লাস সহ এক্সএমএল রচনা করা হচ্ছে
//itemValues is collection of items in Key value pair format
//fileName i name of XML file which to creatd or modified with content
private void WriteInXMLFile(System.Collections.Generic.Dictionary<string, object> itemValues, string fileName)
{
string filePath = "C:\\\\tempXML\\" + fileName + ".xml";
try
{
if (System.IO.File.Exists(filePath))
{
XmlDocument doc = new XmlDocument();
doc.Load(filePath);
XmlNode rootNode = doc.SelectSingleNode("Documents");
XmlNode pageNode = doc.CreateElement("Document");
rootNode.AppendChild(pageNode);
foreach (string key in itemValues.Keys)
{
XmlNode attrNode = doc.CreateElement(key);
attrNode.InnerText = Convert.ToString(itemValues[key]);
pageNode.AppendChild(attrNode);
//doc.DocumentElement.AppendChild(attrNode);
}
doc.DocumentElement.AppendChild(pageNode);
doc.Save(filePath);
}
else
{
XmlDocument doc = new XmlDocument();
using(System.IO.FileStream fs = System.IO.File.Create(filePath))
{
//Do nothing
}
XmlNode rootNode = doc.CreateElement("Documents");
doc.AppendChild(rootNode);
doc.Save(filePath);
doc.Load(filePath);
XmlNode pageNode = doc.CreateElement("Document");
rootNode.AppendChild(pageNode);
foreach (string key in itemValues.Keys)
{
XmlNode attrNode = doc.CreateElement(key);
attrNode.InnerText = Convert.ToString(itemValues[key]);
pageNode.AppendChild(attrNode);
//doc.DocumentElement.AppendChild(attrNode);
}
doc.DocumentElement.AppendChild(pageNode);
doc.Save(filePath);
}
}
catch (Exception ex)
{
}
}
OutPut look like below
<Dcouments>
<Document>
<DocID>01<DocID>
<PageName>121<PageName>
<Author>Mr. ABC<Author>
<Dcoument>
<Document>
<DocID>02<DocID>
<PageName>122<PageName>
<Author>Mr. PQR<Author>
<Dcoument>
</Dcouments>
আপনি যদি ডিজাইনারে কোনও টাইপ করা ডেটাसेट তৈরি করেন তবে আপনি স্বয়ংক্রিয়ভাবে একটি এক্সএসডি পাবেন, একটি দৃ typ়ভাবে টাইপ করা বস্তু, এবং কোডের এক লাইনের সাহায্যে এক্সএমএল লোড এবং সংরক্ষণ করতে পারেন।
আমার ব্যক্তিগত মতামত, একজন সি # প্রোগ্রামার হিসাবে, সি # তে এক্সএমএলকে মোকাবেলা করার সর্বোত্তম উপায় হ'ল কোডটির সেই অংশটি একটি ভিবি। নেট প্রকল্পে অর্পণ করা। .NET 3.5 এ, ভিবি। নেট নেট এক্সএমএল লিটারালস রয়েছে যা এক্সএমএলকে আরও স্বজ্ঞাগত করে তোলে। উদাহরণস্বরূপ এখানে দেখুন:
ভিজ্যুয়াল বেসিকটিতে লিনকিউ থেকে এক্সএমএল এর ওভারভিউ
(সি # কোড নয়, ভিবি কোড প্রদর্শনের জন্য পৃষ্ঠাটি সেট করতে ভুলবেন না))
আমি প্রকল্পের বাকি অংশটি সি # তে লিখতাম, তবে একটি রেফারেন্সড ভিবি প্রকল্পে এক্সএমএল হ্যান্ডেল করব।
nyxtom,
উদাহরণ 1-এ "ডক" এবং "এক্সডোক" মিলবে না?
XDocument **doc** = XDocument.Load(pathToXml);
List<Person> people = (from xnode in **xdoc**.Element("People").Elements("Person")
select new Person
{
Name = xnode.Attribute("Name").Value
}).ToList();
কুকির উত্তরটি ভাল ... তবে কীভাবে কোনও এক্সএসডি (বা এক্সএমএল) থেকে দৃ strongly়ভাবে টাইপ করা অবজেক্ট তৈরি করতে হবে এবং কয়েকটি লাইনের কোডটিতে সিরিয়ালাইজ / ডিসেরায়ালাইজ করা যায় সে সম্পর্কিত বিশদ নির্দেশাবলী এখানে রয়েছে:
আপনার যদি কখনও XmlNode
<=> XNode
<=> XElement
(যেমন লিনকিউ ব্যবহারের জন্য) এর মধ্যে ডেটা রূপান্তর করতে হয় তবে এই এক্সটেনশনগুলি আপনার পক্ষে সহায়ক হতে পারে:
public static class MyExtensions
{
public static XNode GetXNode(this XmlNode node)
{
return GetXElement(node);
}
public static XElement GetXElement(this XmlNode node)
{
XDocument xDoc = new XDocument();
using (XmlWriter xmlWriter = xDoc.CreateWriter())
node.WriteTo(xmlWriter);
return xDoc.Root;
}
public static XmlNode GetXmlNode(this XElement element)
{
using (XmlReader xmlReader = element.CreateReader())
{
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(xmlReader);
return xmlDoc;
}
}
public static XmlNode GetXmlNode(this XNode node)
{
return GetXmlNode(node);
}
}
ব্যবহার:
XmlDocument MyXmlDocument = new XmlDocument();
MyXmlDocument.Load("MyXml.xml");
XElement MyXElement = MyXmlDocument.GetXElement(); // Convert XmlNode to XElement
List<XElement> List = MyXElement.Document
.Descendants()
.ToList(); // Now you can use LINQ
...