c# - मैं सी#में एक्सएमएल कैसे बना सकता हूं?




xml (8)

अतीत में मैंने अपना एक्सएमएल स्कीमा बनाया है, फिर सी # कक्षाएं उत्पन्न करने के लिए एक उपकरण का उपयोग किया जो उस स्कीमा को क्रमबद्ध करेगा। एक्सएमएल स्कीमा डेफिनिशन टूल एक उदाहरण है

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

मैं सी # में वैध एक्सएमएल कैसे उत्पन्न कर सकता हूं?


ऊपरोक्त अनुसार।

मैं stringbuilder.append () का उपयोग करता हूं।

बहुत सरल, और फिर आप xmldocument.load (पैरामीटर के रूप में strinbuilder ऑब्जेक्ट) कर सकते हैं।

आप स्वयं को परिशिष्ट पैरामीटर के भीतर string.concat का उपयोग करके स्वयं पाएंगे, लेकिन यह एक बहुत ही सरल दृष्टिकोण है।



मुझे लगता है कि यह संसाधन एक मध्यम एक्सएमएल सेव / लोड के लिए पर्याप्त होना चाहिए: सी # का उपयोग करके एक्सएमएल पढ़ें / लिखें

मेरा काम संगीत नोटेशन स्टोर करना था। मैं एक्सएमएल चुनता हूं, क्योंकि मुझे लगता है कि .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);
            }
    }
}

}
}

सबसे अच्छी बात यह है कि मैंने कोशिश की है कि LINQ से XSD (जो अधिकांश डेवलपर्स के लिए अज्ञात है) है। आप इसे एक एक्सएसडी स्कीमा देते हैं और यह पृष्ठभूमि में आपके लिए पूरी तरह से मैप किए गए पूर्ण दृढ़ता से टाइप किए गए ऑब्जेक्ट मॉडल (LINQ से XML पर आधारित) उत्पन्न करता है, जो वास्तव में काम करना आसान है - और यह आपके ऑब्जेक्ट मॉडल और एक्सएमएल को अपडेट और मान्य करता है रियल टाइम। हालांकि यह अभी भी "पूर्वावलोकन" है, मुझे इसके साथ किसी भी बग का सामना नहीं हुआ है।

यदि आपके पास एक एक्सएसडी स्कीमा है जो इस तरह दिखता है:

  <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 भी XElement (LINQ से XML तक) के रूप में तत्व उत्पन्न करता है।


सरल चीजों के लिए, मैं बस System.XML में मिली XmlDocument / XmlNode / XmlAttribute क्लासेस और XmlDocument DOM का उपयोग करता हूं।

यह मेरे लिए एक्सएमएल उत्पन्न करता है, मुझे बस कुछ वस्तुओं को एक साथ जोड़ना होगा।

हालांकि, बड़ी चीजों पर, मैं एक्सएमएल क्रमबद्धता का उपयोग करता हूं।


यह परिदृश्य पर निर्भर करता है। XmlSerializer निश्चित रूप से एक तरीका है और सीधे एक ऑब्जेक्ट मॉडल पर मैपिंग का लाभ है। .NET 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);

यदि आप डेटा की एक बड़ी स्ट्रीम लिख रहे हैं, तो किसी भी डोम दृष्टिकोण (जैसे XmlDocument / XDocument , आदि) जल्दी से बहुत सारी मेमोरी लेगा। तो यदि आप CSV से 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 का उपयोग करके अधिक प्राप्त नहीं किया है)।


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)
                         )
            );




xml