2010-12-30 14 views
15

मेरे पास सी # में तीन सूची है, परिवर्तनीय नाम l_lstData1, l_lstData2, l_lstData3 हैं।LINQ और XDocument: XML फ़ाइल कैसे बनाएं?

l_lstData1[0] = "India"; 
l_lstData1[1] = "chennai"; 
l_lstData1[2] = "hyderabad"; 
l_lstData1[3] = "calcutta"; 

तो ऊपर एक्सएमएल (तत्व: डेटा) के स्तर विशेषता: मान है = "2"

फ़ाइल संरचना

<FileDetails> 
    <Date FileModified="29/04/2010 12:34:02" /> 
    <Data Name="Data_1" DataList="India" Level="2" /> 
    <Data Name="Data_2" DataList="chennai" Level="2" /> 
    <Data Name="Data_3" DataList="hyderabad" Level="2" /> 
    <Data Name="Data_4" DataList="calcutta" Level="2" /> 
    <Data Name="Data_5" DataList="vijayawada" Level="1" /> 
    <Data Name="Data_6" DataList="cochin" Level="1" /> 
    <Data Name="Data_7" DataList="madurai" Level="0" /> 
    <Data Name="Data_8" DataList="trichy" Level="0" /> 
</FileDetails> 

3 सूचियाँ के मान इस प्रकार हैं है।

l_lstData2[0] = "vijayawada"; 
l_lstData2[1] = "cochin";  

इसलिए उपर्युक्त एक्सएमएल (तत्व: डेटा) की स्तर विशेषता मान = "1" है।

l_lstData3[0] = "madurai"; 
l_lstData3[1] = "trichy";  

इसलिए उपर्युक्त एक्सएमएल (तत्व: डेटा) की स्तर विशेषता मान = "0" है।

उत्तर

30

यह बिल्कुल क्यों "स्तर" गुण निर्दिष्ट कर रहे हैं के रूप में स्पष्ट नहीं है, लेकिन यह आप के लिए प्रासंगिक एक्सएमएल बनाना होगा:

// Used for side-effects in the XElement constructor. This is a bit icky. It's 
// not clear what the "Name" part is really for... 
int count = 1; 

var doc = new XDocument(
    new XElement("FileDetails", 
     new XElement("Date", new XAttribute("FileModified", DateTime.UtcNow)), 
     l_lstData1.Select(x => new XElement("Data", 
      new XAttribute("Name", "Data_" + count++), 
      new XAttribute("DataList", x), 
      new XAttribute("Level", 2))), 
     l_lstData2.Select(x => new XElement("Data", 
      new XAttribute("Name", "Data_" + count++), 
      new XAttribute("DataList", x), 
      new XAttribute("Level", 1))), 
     l_lstData3.Select(x => new XElement("Data", 
      new XAttribute("Name", "Data_" + count++), 
      new XAttribute("DataList", x), 
      new XAttribute("Level", 0))))); 

यह शायद neater हो सकता है अगर आप एक से अनुमानों निकाल सकते आइटम को इसके तत्व में सूचीबद्ध करें, लेकिन "Data_" + count बिट उस मुश्किल को बनाता है। यह स्पष्ट नहीं है कि आपको ईमानदार होने के लिए ऐसी चीज क्यों चाहिए ... यदि आप इसके बिना दूर हो सकते हैं, तो कोड क्लीनर हो सकता है।

मैं एक विकल्प के बिनाName विशेषताओं दस्तावेज़ बनाने के लिए, और फिर उन्हें बाद में पॉप्युलेट होगा लगता है।

private static IEnumerable<XElement> ProjectList(IEnumerable<string> list, 
    int level) 
{ 
    return list.Select(x => new XElement("Data", 
     new XAttribute("DataList", x), 
     new XAttribute("Level", level))); 
} 

तो:

var doc = new XDocument(
    new XElement("FileDetails", 
     new XElement("Date", new XAttribute("FileModified", DateTime.UtcNow)), 
     ProjectList(l_lstData1, 2), 
     ProjectList(l_lstData2, 1), 
     ProjectList(l_lstData3, 0))); 

int count = 1; 
foreach (var element in doc.Descendants("Data")) 
{ 
    element.SetAttributeValue("Name", "Data_" + count++); 
} 
2

के बारे में क्या:

XDocument doc = new XDocument(); 

var total = (from a in list1 select new { Name = a, Level = 2 }).Concat(
      from b in list2 select new { Name = b, Level = 1 }).Concat(
      from c in list3 select new { Name = c, Level = 0 }); 

XElement root = new XElement("FileDetails", from i in Enumerable.Range(0, total.Count()) 
              let element = total.ElementAt(i) 
              let name = new XAttribute("Name", String.Format("Data_{0}", i + 1)) 
              let level = new XAttribute("Level", element.Level) 
              let datalist = new XAttribute("DataList", element.Name) 
              select new XElement("Data", name, datalist, level), 
              new XElement("Date", new XAttribute("FileModified", DateTime.Now))); 
उदाहरण के लिए
संबंधित मुद्दे