আমি কীভাবে সি # তে এক্সএমএল তৈরি করতে পারি?


উত্তর:


510

এটি দৃশ্যের উপর নির্ভর করে। XmlSerializerঅবশ্যই একটি উপায় এবং কোনও অবজেক্ট মডেলটিতে সরাসরি ম্যাপিংয়ের সুবিধা রয়েছে। নেট। 3.5, XDocumentইত্যাদিতেও খুব বন্ধুত্বপূর্ণ। যদি আকারটি খুব বড় হয় তবে XmlWriterআপনার বন্ধু।

একটি জন্য XDocumentউদাহরণ:

Console.WriteLine(
    new XElement("Foo",
        new XAttribute("Bar", "some & value"),
        new XElement("Nested", "data")));

বা একই সাথে XmlDocument:

XmlDocument doc = new XmlDocument();
XmlElement el = (XmlElement)doc.AppendChild(doc.CreateElement("Foo"));
el.SetAttribute("Bar", "some & value");
el.AppendChild(doc.CreateElement("Nested")).InnerText = "data";
Console.WriteLine(doc.OuterXml);

আপনি যদি ডেটার একটি বৃহত স্ট্রিম লিখছেন তবে DOM এর যে কোনও পদ্ধতির (যেমন XmlDocument/ XDocument, ইত্যাদি) খুব দ্রুত স্মৃতি গ্রহণ করবে। সুতরাং আপনি যদি সিএসভি থেকে 100 এমবি এক্সএমএল ফাইল লিখছেন তবে আপনি বিবেচনা করতে পারেন XmlWriter; এটি আরও আদিম (একবারে লেখার জন্য ফায়ার হুজ) তবে খুব দক্ষ (এখানে একটি বড় লুপের কল্পনা করুন):

XmlWriter writer = XmlWriter.Create(Console.Out);
writer.WriteStartElement("Foo");
writer.WriteAttributeString("Bar", "Some & value");
writer.WriteElementString("Nested", "data");
writer.WriteEndElement();

শেষ পর্যন্ত, এর মাধ্যমে XmlSerializer:

[Serializable]
public class Foo
{
    [XmlAttribute]
    public string Bar { get; set; }
    public string Nested { get; set; }
}
...
Foo foo = new Foo
{
    Bar = "some & value",
    Nested = "data"
};
new XmlSerializer(typeof(Foo)).Serialize(Console.Out, foo);

ক্লাসে ম্যাপিং ইত্যাদির জন্য এটি একটি দুর্দান্ত মডেল ইত্যাদি। তবে, আপনি যদি কিছু সহজ কাজ করে থাকেন তবে (বা যদি পছন্দসই এক্সএমএলটির অবজেক্ট মডেলের সাথে সরাসরি সম্পর্ক নেই) তবে ওভারকিল হতে পারে। এর সাথে আরেকটি সমস্যা XmlSerializerহ'ল এটি অপরিবর্তনীয় ধরণের সিরিয়ালাইজ করতে পছন্দ করে না: প্রত্যেকটির অবশ্যই একটি পাবলিক গেটর এবং সেটার থাকতে হবে (যদি না আপনি এটি প্রয়োগ করে নিজেই করেন, তবে আপনি IXmlSerializableব্যবহারের মাধ্যমে খুব বেশি কিছু অর্জন করেন নি XmlSerializer)।


10
XStreamingElement প্রায় ভুলবেন না msdn.microsoft.com/en-us/library/... । :)
টড হোয়াইট

1
এক্সএমএল রাইটারের উদাহরণের জন্য এটি লক্ষ করা গুরুত্বপূর্ণ যে সঠিকভাবে কাজ করার জন্য আপনাকে লেখকটি শেষের দিকে বন্ধ করতে হবে - Writer.WriteEndElement () এর পরে Writer.Close () প্রয়োজন।
মার্কো

@ মারকো যা বলেছে তা সত্য: লেখককে সঠিকভাবে বন্ধ করা গুরুত্বপূর্ণ। লেখককে কল করার পরিবর্তে এটি করার আরও একটি উপায়ও রয়েছে directly ক্লোজ () সরাসরি। আপনি এই জাতীয় ব্যবহারের বিবৃতিতে ক্রিয়েট () এ কলটি মোড়ানো করতে পারেন: (XMLWriter Writer = XMLWriter.Create (Console.Out)) {Writer.WriteStartElement ("Foo") ব্যবহার করে; ইত্যাদি X এক্সএমএল রাইটারের আরও একটি উদাহরণ (কিছুটা বর্ধিত) এখানে রয়েছে: dotnetperls.com/xMLwriter
মর্টেন

@ মুর্টেন শিওর যদি এক্সএমএল রাইটার আইডিস্পোজেবল কার্যকর করে তবে স্টেটমেন্ট ব্যবহার করা সবচেয়ে ভাল বিকল্প।
মার্কো

ভাল পুরানো এক্সএমএল ডকুমেন্টে এটি রয়েছে। সোজা, সহজ এবং পরিষ্কার আপনি যদি XML ডকুমেন্ট তৈরি করছেন।
ফ্রেনকিবি

60

আমি যে চেষ্টা করেছি সবচেয়ে ভাল জিনিসটি হল লিনকিউ থেকে এক্সএসডি (যা বেশিরভাগ বিকাশকারীদের কাছে অজানা)। আপনি এটি একটি এক্সএসডি স্কিমা দিন এবং এটি ব্যাকগ্রাউন্ডে আপনার জন্য একটি দুর্দান্ত ম্যাপযুক্ত সম্পূর্ণ দৃ strongly়-টাইপযুক্ত অবজেক্ট মডেল (লিনকু থেকে এক্সএমএল ভিত্তিক) উত্পন্ন করে, যা এর সাথে কাজ করা সত্যই সহজ - এবং এটি আপনার অবজেক্ট মডেল এবং এক্সএমএলকে আপডেট এবং বৈধ করে তোলে প্রকৃত সময়. এটি এখনও "পূর্বরূপ" থাকা অবস্থায় আমি এর সাথে কোনও বাগের মুখোমুখি হইনি।

আপনার যদি এমন কোনও এক্সএসডি স্কিমা থাকে যা দেখতে এরকম দেখাচ্ছে:

  <xs:element name="RootElement">
     <xs:complexType>
      <xs:sequence>
        <xs:element name="Element1" type="xs:string" />
        <xs:element name="Element2" type="xs:string" />
      </xs:sequence>
       <xs:attribute name="Attribute1" type="xs:integer" use="optional" />
       <xs:attribute name="Attribute2" type="xs:boolean" use="required" />
     </xs:complexType>
  </xs:element>

তারপরে আপনি সহজেই এটির মতো এক্সএমএল তৈরি করতে পারেন:

RootElement rootElement = new RootElement;
rootElement.Element1 = "Element1";
rootElement.Element2 = "Element2";
rootElement.Attribute1 = 5;
rootElement.Attribute2 = true;

অথবা কেবল ফাইলের মতো কোনও এক্সএমএল লোড করুন:

RootElement rootElement = RootElement.Load(filePath);

বা এটি সংরক্ষণ করুন:

rootElement.Save(string);
rootElement.Save(textWriter);
rootElement.Save(xmlWriter);

rootElement.Untyped এছাড়াও এক্সএলেমেন্ট আকারে উপাদানটি সরবরাহ করে (লিনকিউ থেকে এক্সএমএল পর্যন্ত)।


মনে হচ্ছে এই কোডটি কোড কাজ করছে না। যখন আমি এটি তৈরি করতে চাই তখন কোনও সেভ ফিউশন প্রয়োগ করা হয় নাRootElement
ড্যানিলগল্টসম্যান

24
new XElement("Foo",
       from s in nameValuePairList
       select
             new XElement("Bar",
                  new XAttribute("SomeAttr", "SomeAttrValue"),
                          new XElement("Name", s.Name),
                          new XElement("Value", s.Value)
                         )
            );

10

এক্সএমএল রাইটার ভাল এক্সএমএল লেখার দ্রুততম উপায়। এক্সডোকামেন্ট, এক্সএমএল ডকুমেন্ট এবং অন্যান্য কিছু পাশাপাশি কাজ করে তবে এক্সএমএল লেখার জন্য অনুকূলিত হন না। আপনি যত তাড়াতাড়ি এক্সএমএল লিখতে চান তবে অবশ্যই আপনার এক্সএমএল রাইটার ব্যবহার করা উচিত।


6
এটি হ'ল আপনি যদি কম্পিউটারটি এক্সএমএলটি যত দ্রুত সম্ভব লিখতে চান । আপনি যদি বিকাশকারী, সবচেয়ে সহজ এবং প্রাকৃতিক উপায়ে এক্সএমএল তৈরি করতে চান তবে এক্সএমএল রাইটার সম্ভবত সমাধান নয়!
sjy

4

অতীতে আমি আমার এক্সএমএল স্কিমা তৈরি করেছি, তারপরে সি # ক্লাস তৈরির জন্য একটি সরঞ্জাম ব্যবহার করেছি যা সেই স্কিমায় সিরিয়ালাইজ হবে। এক্সএমএল স্কিমা সংজ্ঞা সরঞ্জাম এর একটি উদাহরণ

http://msdn.microsoft.com/en-us/library/x6c1kb0s(VS.71).aspx


4

আমি মনে করি এই সংস্থানটি একটি মাঝারি এক্সএমএল সেভ / লোডের জন্য যথেষ্ট হবে: সি # ব্যবহার করে এক্সএমএল পড়ুন / লিখুন

আমার কাজটি ছিল সংগীতের স্বরলিপি সংরক্ষণ করা। আমি এক্সএমএল বেছে নিন, কারণ আমি .NET কাজের জন্য সহজ সমাধান করার জন্য যথেষ্ট পরিণত হয়েছে। আমি সঠিক ছিলাম :)

এটি আমার গানের ফাইলের প্রোটোটাইপ:

<music judul="Kupu-Kupu yang Lucu" pengarang="Ibu Sud" tempo="120" birama="4/4" nadadasar="1=F" biramapembilang="4" biramapenyebut="4">
    <not angka="1" oktaf="0" naikturun="" nilai="1"/>
    <not angka="2" oktaf="0" naikturun="" nilai="0.5"/>
    <not angka="5" oktaf="1" naikturun="/" nilai="0.25"/>
    <not angka="2" oktaf="0" naikturun="\" nilai="0.125"/>
    <not angka="1" oktaf="0" naikturun="" nilai="0.0625"/>
</music>

এটি বেশ সহজেই সমাধান করা যেতে পারে:

ফাইলটিতে সংরক্ষণের জন্য:

 private void saveToolStripMenuItem_Click(object sender, EventArgs e)
 {
     saveFileDialog1.Title = "Save Song File";
     saveFileDialog1.Filter = "Song Files|*.xsong";
     if (saveFileDialog1.ShowDialog() == DialogResult.OK)
     {
         FileStream fs = new FileStream(saveFileDialog1.FileName, FileMode.Create);
         XmlTextWriter w = new XmlTextWriter(fs, Encoding.UTF8);
         w.WriteStartDocument();
         w.WriteStartElement("music");
         w.WriteAttributeString("judul", Program.music.getTitle());
         w.WriteAttributeString("pengarang", Program.music.getAuthor());
         w.WriteAttributeString("tempo", Program.music.getTempo()+"");
         w.WriteAttributeString("birama", Program.music.getBirama());
         w.WriteAttributeString("nadadasar", Program.music.getNadaDasar());
         w.WriteAttributeString("biramapembilang", Program.music.getBiramaPembilang()+"");
         w.WriteAttributeString("biramapenyebut", Program.music.getBiramaPenyebut()+"");

         for (int i = 0; i < listNotasi.Count; i++)
         {
             CNot not = listNotasi[i];
             w.WriteStartElement("not");
             w.WriteAttributeString("angka", not.getNot() + "");
             w.WriteAttributeString("oktaf", not.getOktaf() + "");
             String naikturun="";
             if(not.isTurunSetengah())naikturun="\\";
             else if(not.isNaikSetengah())naikturun="/";
             w.WriteAttributeString("naikturun",naikturun);
             w.WriteAttributeString("nilai", not.getNilaiNot()+"");
             w.WriteEndElement();
         }
         w.WriteEndElement();

         w.Flush();
         fs.Close();
     }

 }

লোড ফাইলের জন্য:

openFileDialog1.Title = "Open Song File";
openFileDialog1.Filter = "Song Files|*.xsong";
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
    FileStream fs = new FileStream(openFileDialog1.FileName, FileMode.Open);
    XmlTextReader r = new XmlTextReader(fs);

    while (r.Read())
    {
        if (r.NodeType == XmlNodeType.Element)
        {
            if (r.Name.ToLower().Equals("music"))
            {
                Program.music = new CMusic(r.GetAttribute("judul"),
                    r.GetAttribute("pengarang"),
                    r.GetAttribute("birama"),
                    Convert.ToInt32(r.GetAttribute("tempo")),
                    r.GetAttribute("nadadasar"),
                    Convert.ToInt32(r.GetAttribute("biramapembilang")),
                    Convert.ToInt32(r.GetAttribute("biramapenyebut")));
            }
            else
                if (r.Name.ToLower().Equals("not"))
                {
                    CNot not = new CNot(Convert.ToInt32(r.GetAttribute("angka")), Convert.ToInt32(r.GetAttribute("oktaf")));
                    if (r.GetAttribute("naikturun").Equals("/"))
                    {
                        not.setNaikSetengah();
                    }
                    else if (r.GetAttribute("naikturun").Equals("\\"))
                    {
                        not.setTurunSetengah();
                    }
                    not.setNilaiNot(Convert.ToSingle(r.GetAttribute("nilai")));
                    listNotasi.Add(not);
                }
        }
        else
            if (r.NodeType == XmlNodeType.Text)
            {
                Console.WriteLine("\tVALUE: " + r.Value);
            }
    }
}

}
}

1

সাধারণ জিনিসগুলির জন্য, আমি কেবল সিস্টেম.এক্সএমএলে পাওয়া এক্সএমএল ডকুমেন্ট / এক্সএমএলনোড / এক্সএমএলঅ্যাট্রিবিউট ক্লাস এবং এক্সএমএল ডকুমেন্ট ডিওএম ব্যবহার করি।

এটি আমার জন্য এক্সএমএল তৈরি করে, আমাকে কেবল কয়েকটি আইটেম একসাথে লিঙ্ক করা দরকার।

তবে বড় জিনিসগুলিতে আমি এক্সএমএল সিরিয়ালাইজেশন ব্যবহার করি।


1

সাধারণ ক্ষেত্রে, আমি এক্সএমএল আউটপুটকে এক্সএমএল তৈরির জন্য একটি সাবলীল ইন্টারফেসটি দেখার পরামর্শ দিই

বৈধ এক্সএমএল তৈরি করার সময়, এক্সএমএলআউটপুট পাঠযোগ্য ও রক্ষণাবেক্ষণযোগ্য কোড সহ সাধারণ এক্সএমএল তৈরির জন্য দুর্দান্ত। মূল পোস্টে কিছু মহান উদাহরণ রয়েছে।


-3

যেমন উপরে.

আমি স্ট্রিংবিল্ডার.অ্যাপেন্ড () ব্যবহার করি।

খুব সোজা, এবং তারপরে আপনি xmldocament.load (প্যারামিটার হিসাবে স্ট্রিনবিল্ডার অবজেক্ট) করতে পারেন।

আপনি সম্ভবত পরিচ্ছেদের প্যারামিটারের মধ্যে স্ট্রিংকনক্যাট ব্যবহার করে দেখতে পাবেন তবে এটি একটি খুব সহজ পদ্ধতি।


11
আপনি যখন কোনও কিছু সঠিকভাবে এনকোড করতে এবং অবৈধ এক্সএমএল লিখতে ভুলে যান তবে ব্যতীত।
রবার্ট পলসন

3
এই উত্তরটি একেবারে নিন্দিত হয়েছে, তবে এই প্রশ্নের উপর ভিত্তি করে আমি আমার নিজের একটি বাস্তবায়ন দেখেছি যেখানে আমি এক্সএমএল তৈরি করি। আমার বিশেষ প্রকল্পের জন্য আমি ধারাবাহিকভাবে দেখতে পেলাম যে স্ট্রিংবিল্ডারের মাধ্যমে বিল্ডিংয়ের ফলে XDocament / XMLWriter ব্যবহারের চেয়ে 10% দ্রুত প্রক্রিয়াকরণ হয়েছিল। তবে, আমি এক্সএমএল নিয়ে স্বাচ্ছন্দ্য বোধ করি এবং এটি আমার বিশেষ প্রকল্পের জন্য। (রেফারেন্সের জন্য, চূড়ান্ত এক্সএমএল আকারগুলি প্রায় ৮.৪ এমবি, ৮০০০ এর বেশি লাইন সহ))
জেমস স্কেম্প

2
আপনি যদি অ্যাপ্লিকেশন কর্মক্ষমতা (আমরা কী এখানে মিলিসেকেন্ডের উন্নতির কথা বলছি?) এবং অ্যাপ্লিকেশন রক্ষণাবেক্ষণের মধ্যে ব্যবসায়ের পরিমাপ করেছেন কিনা তা জানতে আগ্রহী হব (এখনই কী পরিবর্তন করার আগে আপনার ইঞ্জিনিয়ারদের কোডটির সাথে নিজেকে পরিচিত করতে হবে?)
ড্যান এস্পারজা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.