C # में XDocument का उपयोग कर XML फ़ाइल निर्माण


83

मेरे पास एक List<string>"नमूना सूची" है जिसमें शामिल है

Data1
Data2
Data3...

फ़ाइल संरचना की तरह है

<file>
   <name filename="sample"/>
   <date modified ="  "/>
   <info>
     <data value="Data1"/> 
     <data value="Data2"/>
     <data value="Data3"/>
   </info>
</file>

मैं वर्तमान में ऐसा करने के लिए XmlDocument का उपयोग कर रहा हूं।

उदाहरण:

List<string> lst;
XmlDocument XD = new XmlDocument();
XmlElement root = XD.CreateElement("file");
XmlElement nm = XD.CreateElement("name");
nm.SetAttribute("filename", "Sample");
root.AppendChild(nm);
XmlElement date = XD.CreateElement("date");
date.SetAttribute("modified", DateTime.Now.ToString());
root.AppendChild(date);
XmlElement info = XD.CreateElement("info");
for (int i = 0; i < lst.Count; i++) 
{
    XmlElement da = XD.CreateElement("data");
    da.SetAttribute("value",lst[i]);
    info.AppendChild(da);
}
root.AppendChild(info);
XD.AppendChild(root);
XD.Save("Sample.xml");

मैं XDocument का उपयोग करके समान XML संरचना कैसे बना सकता हूं?


8
अब तक आपने जो कोड लिखा है, उसे पोस्ट करें। आमतौर पर लोग आपके लिए सिर्फ अपना कोड लिखना पसंद नहीं करते हैं।
मिच गेहूं

5
सहमत - यह वास्तव में एक बयान में करने के लिए बेहद सरल है, लेकिन सिर्फ आपको जवाब देने से आपको बहुत कुछ सीखने में मदद नहीं मिलेगी।
जॉन स्कीट

जवाबों:


191

LINQ to XML तीन सुविधाओं के माध्यम से इसे बहुत सरल बनाने की अनुमति देता है:

  • आप उस दस्तावेज़ को जाने बिना किसी ऑब्जेक्ट का निर्माण कर सकते हैं जिसका वह हिस्सा है
  • आप एक ऑब्जेक्ट का निर्माण कर सकते हैं और बच्चों को तर्क के रूप में प्रदान कर सकते हैं
  • यदि कोई तर्क चलने योग्य है, तो उसे पुनरावृत्त किया जाएगा

तो यहाँ आप बस कर सकते हैं:

void Main()
{
    List<string> list = new List<string>
    {
        "Data1", "Data2", "Data3"
    };

    XDocument doc =
      new XDocument(
        new XElement("file",
          new XElement("name", new XAttribute("filename", "sample")),
          new XElement("date", new XAttribute("modified", DateTime.Now)),
          new XElement("info",
            list.Select(x => new XElement("data", new XAttribute("value", x)))
          )
        )
      );

    doc.Save("Sample.xml");
}

मैंने इस कोड लेआउट का उपयोग जानबूझ कर किया है ताकि कोड स्वयं दस्तावेज़ की संरचना को प्रतिबिंबित कर सके।

यदि आप एक ऐसा तत्व चाहते हैं जिसमें एक टेक्स्ट नोड हो, तो आप उसे केवल एक अन्य कंस्ट्रक्टर तर्क के रूप में पाठ में पास करके निर्माण कर सकते हैं:

// Constructs <element>text within element</element>
XElement element = new XElement("element", "text within element");

16
नोट: यदि आपके पास ऐसे तत्व हैं जिनके लिए आपको "आंतरिक पाठ" की आवश्यकता होती है, तो आप उन्हें इस तरह जोड़ते हैं: new XElement("description","this is the inner text of the description element.");(इसी तरह आप विशेषता / मूल्य जोड़े जोड़ते हैं)
मिस्टर

बहुत अच्छा दृष्टिकोण। मैंने एक पल संघर्ष किया कि कैसे विशेषताओं को जोड़ा जाए और एक ही बार में तत्वों का एक लाइनक-एक्सप्रेशन। इसलिए अगर किसी को दिलचस्पी है, तो मैं चुनता हूं: new XElement("info", new object[] { new XAttribute("foo", "great"), new XAttribute("bar", "not so great") }.Concat(list.Select(x => new XElement("child", ...))))उपयुक्त रेखा के साथ, यह फिर से ठीक दिखता है।
सेबेस्टियन वर्कर

0

.Save विधि का उपयोग करने का अर्थ है कि आउटपुट में BOM होगा, जो सभी अनुप्रयोगों से खुश नहीं होगा। यदि आप BOM नहीं चाहते हैं, और यदि आप निश्चित नहीं हैं, तो मेरा सुझाव है कि आप नहीं करते हैं, तो एक लेखक के XDocument पास करें:

using (var writer = new XmlTextWriter(".\\your.xml", new UTF8Encoding(false)))
{
    doc.Save(writer);
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.