2016-04-14 20 views
0

私は前のデータセットを使用したことがないが、今、私は正確に次のXML出力を生成したデータセットを作成したい:C#で複雑な(より深い階層の)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> 
     ... 
    </candidate> 
    ... 
    </candidates> 
</candidatelist> 

私のアプローチは次のようになります。コラム「名前」と「personalinfo」データテーブルを作成し、「ファーストネーム"、...、および" item "列のデータ可能な" items "があります。それから私は、「候補」という名前のデータセットを作成し、このように両方のテーブルを追加することができます。

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); 

しかし、どのように私は新しいセット「候補者」に、いくつかの候補を追加し、(一緒に「コメント」付き)という新しいセットを追加することができます「候補者」という名前のセットに?

+0

「データセット」にする必要がありますか?オブジェクトグラフ( 'candidatelist'を' comment'プロパティと 'List 'などの 'class'として作成するのは簡単ではないでしょうか?' XmlSerializer'を介してそれを直列化しますか? –

+0

Timと同意してください、XmlSerialiserを使用してください –

+0

@TimBourguignonはい、それは私の転倒です、ありがとうございます。それでも私はDataSetsでこれを解決する方法が不思議です。 – Quen

答えて

0

(XmlSerializerをするために)....これを試してみてください

のようなものを試してみてくださいtest.xmlという名前のファイル(あなたのアプリケーションのビルドフォルダにあります)にあります。例では、(のtest.xmlファイルに)XMLから戻って候補者のcandidatelistにXMLをデシリアライズ

Usings .....

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

クラス.....

を実証します
[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; } 
} 

コード.....

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)); 
    } 

(のtest.xmlから)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

あなたのソリューションは、要求されたようなデータセットを使用せず、たくさんの候補を追加するときにはあまり役に立たないでしょう。 – jdweng

+0

私が答えに示したように、私はXmlSerializerを使用しました。OPは、XmlSerializerを使用することが彼の「フォールバック」であるとコメントしています...そこには...ありがとうございました。それは単純に、新しい候補と任意のソリューションに追加する必要があるすべての詳細を追加することです....自分自身を含む – Monty

+1

私はついにそれがはるかに直感的であるためシリアライザのために行きました。ありがとう! – Quen

0

コードは最初candidatelistのインスタンスを作成し、2つの候補 を追加し、それはその後、XMLにデータをシリアル化し、この

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

上記のソリューションでは、1つのデータテーブルしか使用しませんでした。必要に応じて、このデータテーブルをデータセットに追加できます。別のテーブルに日付が必要な場合を除き、データセットが必要かどうかはわかりません。日付が必要な場合は、別の列をデータテーブルに追加できます。 – jdweng

関連する問題