मैं C # में वैध XML कैसे बना सकता हूं?
मैं C # में वैध XML कैसे बना सकता हूं?
जवाबों:
यह परिदृश्य पर निर्भर करता है। 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 एमबी XML फ़ाइल लिख रहे हैं , तो आप विचार कर सकते हैं 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);
यह कक्षाओं के मानचित्रण के लिए एक अच्छा मॉडल है, आदि; हालाँकि, यह ओवरकिल हो सकता है यदि आप कुछ सरल कर रहे हैं (या यदि वांछित XML का वास्तव में ऑब्जेक्ट मॉडल से सीधा संबंध नहीं है)। इसके साथ एक और मुद्दा XmlSerializer
यह है कि यह अपरिवर्तनीय प्रकारों को क्रमबद्ध करना पसंद नहीं करता है: सब कुछ एक सार्वजनिक गेट्टर और सेटर होना चाहिए (जब तक कि आप इसे लागू करने से खुद IXmlSerializable
को पूरा नहीं करते हैं, जिस स्थिति में आपने उपयोग करके बहुत कुछ हासिल नहीं किया है XmlSerializer
)।
सबसे अच्छी बात यह है कि मैंने कोशिश की है कि LINQ से XSD (जो अधिकांश डेवलपर्स के लिए अज्ञात है)। आप इसे एक एक्सएसडी स्कीमा देते हैं और यह पृष्ठभूमि में आपके लिए एक पूरी तरह से मैप की गई पूरी तरह से टाइप की गई ऑब्जेक्ट मॉडल (LINQ से XML पर आधारित) उत्पन्न करता है, जिसके साथ काम करना वास्तव में आसान है - और यह आपके ऑब्जेक्ट मॉडल और XML को अपडेट और सत्यापित करता है रियल टाइम। हालांकि यह अभी भी "पूर्वावलोकन" है, मैंने इसके साथ किसी भी कीड़े का सामना नहीं किया है।
यदि आपके पास एक XSD स्कीमा है जो इस तरह दिखता है:
<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>
तो आप बस इस तरह XML का निर्माण कर सकते हैं:
RootElement rootElement = new RootElement;
rootElement.Element1 = "Element1";
rootElement.Element2 = "Element2";
rootElement.Attribute1 = 5;
rootElement.Attribute2 = true;
या इस तरह से फ़ाइल से बस एक XML लोड करें:
RootElement rootElement = RootElement.Load(filePath);
या इसे इस तरह से बचाएं:
rootElement.Save(string);
rootElement.Save(textWriter);
rootElement.Save(xmlWriter);
rootElement.Untyped
तत्व को XElement (LINQ से XML तक) के रूप में भी देता है।
RootElement
XmlWriter अच्छा XML लिखने का सबसे तेज़ तरीका है। XDocument, XMLDocument और कुछ अन्य अच्छे aswell का काम करते हैं, लेकिन XML लिखने के लिए अनुकूलित नहीं हैं। यदि आप XML को जितनी जल्दी हो सके लिखना चाहते हैं, तो आपको निश्चित रूप से XmlWriter का उपयोग करना चाहिए।
पूर्व में मैंने अपनी XML स्कीमा बनाई है, फिर C # कक्षाएं बनाने के लिए एक उपकरण का उपयोग किया जो उस स्कीमा को अनुक्रमित करेगा। XML स्कीमा परिभाषा उपकरण एक उदाहरण है
http://msdn.microsoft.com/en-us/library/x6c1kb0s(VS.71).aspx
मुझे लगता है कि इस संसाधन को मध्यम XML सहेजें / लोड के लिए पर्याप्त होना चाहिए: C # का उपयोग करके XML पढ़ें / लिखें ।
मेरा काम म्यूज़िकल नोटेशन को स्टोर करना था। मैं XML चुनता हूं, क्योंकि मुझे लगता है कि .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);
}
}
}
}
}
साधारण चीजों के लिए, मैं अभी System.XML में पाए जाने वाले XmlDocument / XmlNode / XmlAttribute Classes और XmlDocument DOM का उपयोग करता हूं।
यह मेरे लिए XML उत्पन्न करता है, मुझे बस कुछ वस्तुओं को एक साथ जोड़ने की आवश्यकता है।
हालाँकि, बड़ी चीजों पर, मैं XML क्रमांकन का उपयोग करता हूं।
ऊपरोक्त अनुसार।
मैं stringbuilder.append () का उपयोग करता हूं।
बहुत सीधा है, और फिर आप xmldocument.load (पैरामीटर के रूप में स्ट्रिनबिल्डर ऑब्जेक्ट) कर सकते हैं।
आप शायद अपने आप को परिशिष्ट पैरामीटर के भीतर string.concat का उपयोग कर पाएंगे, लेकिन यह एक बहुत ही सरल दृष्टिकोण है।