2016-04-14 20 views
0

Daha önce veri setlerini hiç kullanılmamış ama şimdi tam olarak aşağıdaki XML çıktı üretir bir veri kümesi oluşturmak istiyor: "FIRSTNAME sütunlar "adıyla" ile "personalinfo" Bir datatable oluştururken:C# 'da karmaşık (daha derin hiyerarşi) XML çıktısı için veri kümesi nasıl oluşturulur?

<candidatelist> 
    <comment> 
    created 15.03.2016 
    </comment> 
    <candidates> 
    <candidate> 
     <personalinfo> 
     <name>Parker</name> 
     <firstname>Peter</firstname> 
     <sex>M</sex> 
     <birthday>19.02.1993</birthday> 
     <group>group1</group> 
     <language>E</language> 
     <type>H</type> 
     </personalinfo> 
     <items> 
     <item>item1</item> 
     <item>item2</item> 
     <item>item3</item> 
     <item>item4</item> 
     <item>item5</item> 
     <item>item6</item> 
     <item>item7</item> 
     <item>item8</item> 
     </items> 
    </candidate> 
    <candidate> 
     ... 
    </candidate> 
    ... 
    </candidates> 
</candidatelist> 

Benim yaklaşım olur ", ... ve" item "sütununa sahip" datatable "öğeleri. Sonra "aday" adlı bir veri kümesi oluşturmak ve bunun gibi her iki tablo ekleyebilirsiniz:

DataTable table1 = new DataTable("personalinfo"); 
table1.Columns.Add("name"); 
table1.Columns.Add("firstname"); 
... 
table1.Rows.Add("Parker", "Peter", ...); 

DataTable table2 = new DataTable("items"); 
table2.Columns.Add("item"); 
table2.Rows.Add("item1"); 
table2.Rows.Add("item2"); 
... 

DataSet set = new DataSet("candidate"); 
set.Tables.Add(table1); 
set.Tables.Add(table2); 

Ama nasıl "adaylar" yeni bir dizi için çeşitli adayları ekleyip (birlikte "yorum" ile birlikte) yeni kümesi ekleyebilirsiniz "candidatelist" adlı bir kümeye mi?

+0

bir 'DataSet' olmak zorunda mı? (a 'comment' özelliği ve bir' Listesi 'vb ile' class' olarak candidatelist' ') bir amacı, grafik oluşturmak ve 'XmlSerializer' yoluyla seri için daha kolay olmaz? –

+0

, Tim ile Anlaştı XmlSerialiser –

+0

kullanmak @TimBourguignon evet, bu benim geri düşmeyi, teşekkürler bu. Yine de DataSets ile bunun nasıl çözüleceğini merak ediyorum. – Quen

cevap

0

gibi bir şey deneyin, daha sonra XML verilerini serializes test.xml adlı bir dosyada (uygulamanızın derleme klasöründe bulunur). Örnek ayrıca ..... XML

usings (test.xml dosyasında) aday candidatelist geri XML De-Dizgeleştirme

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Windows.Forms; 
using System.Xml.Serialization; 

Sınıflar .....

gösteriyor

(Test.xml itibaren)
[XmlRoot(ElementName = "personalinfo")] 
public class Personalinfo 
{ 
    [XmlElement(ElementName = "name")] 
    public string Name { get; set; } 
    [XmlElement(ElementName = "firstname")] 
    public string Firstname { get; set; } 
    [XmlElement(ElementName = "sex")] 
    public string Sex { get; set; } 
    [XmlElement(ElementName = "birthday")] 
    public string Birthday { get; set; } 
    [XmlElement(ElementName = "group")] 
    public string Group { get; set; } 
    [XmlElement(ElementName = "language")] 
    public string Language { get; set; } 
    [XmlElement(ElementName = "type")] 
    public string Type { get; set; } 
} 

[XmlRoot(ElementName = "items")] 
public class Items 
{ 
    public Items() 
    { 
     this.Item = new List<string>(); 
    } 
    [XmlElement(ElementName = "item")] 
    public List<string> Item { get; set; } 
} 

[XmlRoot(ElementName = "candidate")] 
public class Candidate 
{ 
    public Candidate() 
    { 
     this.Items = new Items(); 
    } 
    [XmlElement(ElementName = "personalinfo")] 
    public Personalinfo Personalinfo { get; set; } 
    [XmlElement(ElementName = "items")] 
    public Items Items { get; set; } 
} 

[XmlRoot(ElementName = "candidates")] 
public class Candidates 
{ 
    public Candidates() 
    { 
     this.Candidate = new List<Candidate>(); 
    } 
    [XmlElement(ElementName = "candidate")] 
    public List<Candidate> Candidate { get; set; } 
} 

[XmlRoot(ElementName = "candidatelist")] 
public class Candidatelist 
{ 
    public Candidatelist() 
    { 
     this.Candidates = new Candidates(); 
    } 
    [XmlElement(ElementName = "comment")] 
    public string Comment { get; set; } 
    [XmlElement(ElementName = "candidates")] 
    public Candidates Candidates { get; set; } 
} 

Kod .....

private void Form1_Load(object sender, EventArgs e) 
    { 
     try 
     { 
      Candidatelist Candidatelist = new Candidatelist(); 
      Candidatelist.Comment = "created 15.03.2016"; 

      Candidate candidate1 = new Candidate(); 
      candidate1.Personalinfo = new Personalinfo() { Name = "Parker", Firstname = "Peter", Sex = "M", Birthday = "19.02.1993", Group = "group1", Language = "E", Type = "H" }; 
      candidate1.Items.Item.Add("Item1"); 
      candidate1.Items.Item.Add("Item2"); 
      candidate1.Items.Item.Add("Item3"); 
      candidate1.Items.Item.Add("Item4"); 
      candidate1.Items.Item.Add("Item5"); 
      candidate1.Items.Item.Add("Item6"); 
      candidate1.Items.Item.Add("Item7"); 
      candidate1.Items.Item.Add("Item8"); 

      Candidatelist.Candidates.Candidate.Add(candidate1); 

      Candidate candidate2 = new Candidate(); 
      candidate2.Personalinfo = new Personalinfo() { Name = "John", Firstname = "Doe", Sex = "M", Birthday = "19.02.1993", Group = "group1", Language = "E", Type = "H" }; 
      candidate2.Items.Item.Add("Item1"); 
      candidate2.Items.Item.Add("Item2"); 
      candidate2.Items.Item.Add("Item3"); 
      candidate2.Items.Item.Add("Item4"); 
      candidate2.Items.Item.Add("Item5"); 
      candidate2.Items.Item.Add("Item6"); 
      candidate2.Items.Item.Add("Item7"); 
      candidate2.Items.Item.Add("Item8"); 

      Candidatelist.Candidates.Candidate.Add(candidate2); 

      // and to Serialize to XML 
      Serialize(Candidatelist); 

      // and to Deserialize from XML 
      Candidatelist deserializedCandidatelist = Deserialize<Candidatelist>(); 

     } 
     catch (Exception ex) 
     { 
      throw; 
     } 

    } 

    private static void Serialize<T>(T data) 
    { 

     // Use a file stream here. 
     using (TextWriter WriteFileStream = new StreamWriter("test.xml")) 
     { 
      // Construct a SoapFormatter and use it 
      // to serialize the data to the stream. 
      XmlSerializer SerializerObj = new XmlSerializer(typeof(T)); 

      try 
      { 
       // Serialize EmployeeList to the file stream 
       SerializerObj.Serialize(WriteFileStream, data); 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(string.Format("Failed to serialize. Reason: {0}", ex.Message)); 
      } 
     } 
    } 

    private static T Deserialize<T>() where T : new() 
    { 
     //List<Employee> EmployeeList2 = new List<Employee>(); 
     // Create an instance of T 
     T ReturnListOfT = CreateInstance<T>(); 


     // Create a new file stream for reading the XML file 
     using (FileStream ReadFileStream = new FileStream("test.xml", FileMode.Open, FileAccess.Read, FileShare.Read)) 
     { 
      // Construct a XmlSerializer and use it 
      // to serialize the data from the stream. 
      XmlSerializer SerializerObj = new XmlSerializer(typeof(T)); 
      try 
      { 
       // Deserialize the hashtable from the file 
       ReturnListOfT = (T)SerializerObj.Deserialize(ReadFileStream); 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(string.Format("Failed to serialize. Reason: {0}", ex.Message)); 
      } 

     } 
     // return the Deserialized data. 
     return ReturnListOfT; 
    } 

    // function to create instance of T 
    public static T CreateInstance<T>() where T : new() 
    { 
     return (T)Activator.CreateInstance(typeof(T)); 
    } 

XML

<?xml version="1.0" encoding="utf-8"?> 
<candidatelist xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <comment>created 15.03.2016</comment> 
    <candidates> 
    <candidate> 
     <personalinfo> 
     <name>Parker</name> 
     <firstname>Peter</firstname> 
     <sex>M</sex> 
     <birthday>19.02.1993</birthday> 
     <group>group1</group> 
     <language>E</language> 
     <type>H</type> 
     </personalinfo> 
     <items> 
     <item>Item1</item> 
     <item>Item2</item> 
     <item>Item3</item> 
     <item>Item4</item> 
     <item>Item5</item> 
     <item>Item6</item> 
     <item>Item7</item> 
     <item>Item8</item> 
     </items> 
    </candidate> 
    <candidate> 
     <personalinfo> 
     <name>John</name> 
     <firstname>Doe</firstname> 
     <sex>M</sex> 
     <birthday>19.02.1993</birthday> 
     <group>group1</group> 
     <language>E</language> 
     <type>H</type> 
     </personalinfo> 
     <items> 
     <item>Item1</item> 
     <item>Item2</item> 
     <item>Item3</item> 
     <item>Item4</item> 
     <item>Item5</item> 
     <item>Item6</item> 
     <item>Item7</item> 
     <item>Item8</item> 
     </items> 
    </candidate> 
    </candidates> 
</candidatelist> 
+0

Çözümünüz, talep edilen gibi bir veri kümesi kullanmaz ve çok sayıda aday eklerken çok kullanışlı olmaz. Ben cevap belirtildiği gibi, ben XmlSerializer'ı kullandık – jdweng

+0

, OP XmlSerializer'ı kullanarak yaptığı 'düşmek geri' olduğunu ifade etmiştir ... orada ... Seni .... somurtkan durmaya gerek kullanışlı gelince basitçe yeni Aday ekleyerek meselesi ve gereken tüm ayrıntıları çok daha sezgisel çünkü nihayet serileştiriciye gitti – Monty

+1

kendi dahil .... herhangi çözeltide eklenecek. Teşekkürler! – Quen

0

kod ilk iki aday candidatelist bir örneğini oluşturur ve ekler

(XmlSerializer için) .... bu deneyin bu

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 
using System.Data; 

namespace ConsoleApplication85 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string xml = 
       "<candidatelist>" + 
        "<comment>" + 
        "created 15.03.2016" + 
        "</comment>" + 
        "<candidates>" + 
        "<candidate>" + 
         "<personalinfo>" + 
         "<name>Parker</name>" + 
         "<firstname>Peter</firstname>" + 
         "<sex>M</sex>" + 
         "<birthday>19.02.1993</birthday>" + 
         "<group>group1</group>" + 
         "<language>E</language>" + 
         "<type>H</type>" + 
         "</personalinfo>" + 
         "<items>" + 
         "<item>item1</item>" + 
         "<item>item2</item>" + 
         "<item>item3</item>" + 
         "<item>item4</item>" + 
         "<item>item5</item>" + 
         "<item>item6</item>" + 
         "<item>item7</item>" + 
         "<item>item8</item>" + 
         "</items>" + 
        "</candidate>" + 
        "<candidate>" + 
         "<personalinfo>" + 
         "<name>Parker</name>" + 
         "<firstname>Peter</firstname>" + 
         "<sex>M</sex>" + 
         "<birthday>19.02.1993</birthday>" + 
         "<group>group1</group>" + 
         "<language>E</language>" + 
         "<type>H</type>" + 
         "</personalinfo>" + 
         "<items>" + 
         "<item>item1</item>" + 
         "<item>item2</item>" + 
         "<item>item3</item>" + 
         "<item>item4</item>" + 
         "<item>item5</item>" + 
         "<item>item6</item>" + 
         "<item>item7</item>" + 
         "<item>item8</item>" + 
         "</items>" + 
        "</candidate>" + 
        "</candidates>" + 
       "</candidatelist>"; 

      XDocument doc = XDocument.Parse(xml); 

      DataTable dt = new DataTable(); 
      dt.Columns.Add("name", typeof(string)); 
      dt.Columns.Add("firstname", typeof(string)); 
      dt.Columns.Add("sex", typeof(string)); 
      dt.Columns.Add("birthday", typeof(string)); 
      dt.Columns.Add("group", typeof(string)); 
      dt.Columns.Add("language", typeof(string)); 
      dt.Columns.Add("type", typeof(string)); 
      dt.Columns.Add("item1", typeof(string)); 
      dt.Columns.Add("item2", typeof(string)); 
      dt.Columns.Add("item3", typeof(string)); 
      dt.Columns.Add("item4", typeof(string)); 
      dt.Columns.Add("item5", typeof(string)); 
      dt.Columns.Add("item6", typeof(string)); 
      dt.Columns.Add("item7", typeof(string)); 
      dt.Columns.Add("item8", typeof(string)); 
      dt.Columns.Add("item9", typeof(string)); 
      dt.Columns.Add("item10", typeof(string)); 

      List<XElement> candidates = doc.Descendants("candidate").ToList(); 

      foreach (XElement candidate in candidates) 
      { 
       DataRow newRow = dt.Rows.Add(); 
       newRow["name"] = (string)candidate.Descendants("name").FirstOrDefault(); 
       newRow["firstname"] = (string)candidate.Descendants("firstname").FirstOrDefault(); 
       newRow["sex"] = (string)candidate.Descendants("sex").FirstOrDefault(); 
       newRow["birthday"] = (string)candidate.Descendants("birthday").FirstOrDefault(); 
       newRow["group"] = (string)candidate.Descendants("group").FirstOrDefault(); 
       newRow["language"] = (string)candidate.Descendants("language").FirstOrDefault(); 
       newRow["type"] = (string)candidate.Descendants("type").FirstOrDefault(); 

       List<string> items = candidate.Descendants("item").Select(x => (string)x).ToList(); 
       for (int index = 1; index <= items.Count; index++) 
       { 
        newRow["item" + index.ToString()] = items[index - 1]; 
       } 


      } 

     } 
    } 
} 
+0

Yukarıdaki çözümde yalnızca tek bir veri tabanı kullandım. Gerekirse bu veri tabanını bir veri kümesine ekleyebilirsiniz. Ayrı bir tabloda tarihe gerek duymadığınız sürece veri kümesine ihtiyacınız olup olmadığından emin olun. Tarih gerekliyse veri tabanım için başka bir sütun ekleyebilirsiniz. – jdweng

İlgili konular