मैं C # में XML कैसे बना सकता हूं?


जवाबों:


510

यह परिदृश्य पर निर्भर करता है। 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)।


10
XStreamingElement, msdn.microsoft.com/en-us/library/… के बारे में मत भूलना । :)
टोड व्हाइट

1
XmlWriter उदाहरण के लिए यह ध्यान रखना महत्वपूर्ण है कि आपको लेखक को ठीक से काम करने के लिए इसके लेखक को बंद करने की आवश्यकता है - लेखक ।Close () के लिए आवश्यक है।
मार्को

यह सच है कि @Marko क्या कहता है: लेखक को ठीक से बंद करना महत्वपूर्ण है। ऐसा करने का एक और तरीका भी है, जिसमें कॉलिंग राइटर की जगह है। सीधे ()। आप कॉल का निर्माण इस तरह से एक बयान में कर सकते हैं (): XmlWriter लेखक = XmlWriter.Create (Console.Out)) {लेखक। WiteStartElement ("फू") का उपयोग करके; आदि} यहाँ XmlWriter
मोर्टन

@Morten सुनिश्चित करें कि यदि XmlWriter IDis प्रयोज्य को लागू करता है तो कथन का उपयोग करना सबसे अच्छा विकल्प है।
मार्को

पुराने पुराने XMLDocument में यह सब है। अगर आप XML डॉक्यूमेंट बना रहे हैं तो सीधे, सरल और स्पष्ट।
FrenkyB

60

सबसे अच्छी बात यह है कि मैंने कोशिश की है कि 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
rty

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

XmlWriter अच्छा XML लिखने का सबसे तेज़ तरीका है। XDocument, XMLDocument और कुछ अन्य अच्छे aswell का काम करते हैं, लेकिन XML लिखने के लिए अनुकूलित नहीं हैं। यदि आप XML को जितनी जल्दी हो सके लिखना चाहते हैं, तो आपको निश्चित रूप से XmlWriter का उपयोग करना चाहिए।


6
यही है, यदि आप चाहते हैं कि कंप्यूटर XML को जितनी जल्दी हो सके लिख दे। यदि आप, डेवलपर, XML को सबसे आसान और सबसे प्राकृतिक तरीके से बनाना चाहते हैं, तो XmlWriter शायद समाधान नहीं है!
sjy

4

पूर्व में मैंने अपनी XML स्कीमा बनाई है, फिर C # कक्षाएं बनाने के लिए एक उपकरण का उपयोग किया जो उस स्कीमा को अनुक्रमित करेगा। XML स्कीमा परिभाषा उपकरण एक उदाहरण है

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


4

मुझे लगता है कि इस संसाधन को मध्यम 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);
            }
    }
}

}
}

1

साधारण चीजों के लिए, मैं अभी System.XML में पाए जाने वाले XmlDocument / XmlNode / XmlAttribute Classes और XmlDocument DOM का उपयोग करता हूं।

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

हालाँकि, बड़ी चीजों पर, मैं XML क्रमांकन का उपयोग करता हूं।


1

सरल मामलों के लिए, मैं Xml के निर्माण के लिए एक धाराप्रवाह इंटरफ़ेस XmlOutput को देखने का भी सुझाव दूंगा

XmlOutput मान्य Xml उत्पन्न करते समय पठनीय और बनाए रखने योग्य कोड के साथ सरल Xml निर्माण के लिए बहुत अच्छा है। मूल पोस्ट कुछ महान उदाहरण है।


-3

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

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

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

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


11
सिवाय जब आप किसी चीज़ को ठीक से एनकोड करना और अवैध Xml लिखना भूल जाते हैं।
रॉबर्ट पॉलसन

3
यह उत्तर बिल्कुल स्लैम हो गया, लेकिन इस प्रश्न के आधार पर मैंने अपने स्वयं के कार्यान्वयन में से एक पर एक नज़र डाली जहाँ मैं XML का निर्माण करता हूं। अपने विशेष प्रोजेक्ट के लिए मैंने लगातार पाया कि स्ट्रिंगबर्ल के माध्यम से बिल्डिंग XDocument / XmlWriter का उपयोग करने की तुलना में प्रसंस्करण समय का 10% तेजी से हुआ। लेकिन, मैं XML के साथ सहज महसूस करता हूं, और यह मेरे विशेष प्रोजेक्ट के लिए है। (संदर्भ के लिए, अंतिम एक्सएमएल आकार 3.4 एमबी के आसपास हैं, 8000 से अधिक लाइनों के साथ।)
जेम्स स्कम्प

2
मुझे यह जानने की उत्सुकता होगी कि क्या आपने एप्लिकेशन प्रदर्शन के बीच व्यापार को मापा है (क्या हम यहां मिलिसेकंड सुधार की बात कर रहे हैं?) और आवेदन रखरखाव (क्या आपके इंजीनियरों को अब बदलाव करने से पहले एक घंटे के लिए कोड के साथ खुद को परिचित करने की आवश्यकता है?)
Dan एस्पाराज़ा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.