2013-06-24 22 views
2

我是新來的XML和我想保存的格式如下東西:C#的xml:如何保存嵌套行

<?xml version="1.0" standalone="yes"?> 
<NewDataSet> 
    <brickTable> 
    <value>23039</value> 
    <Tile>Brick</Tile> 
    <X>18400</X> 
    <Y>64</Y> 
    <items> 
      <itemType>Type1</itemType> 
    </items> 
    <items> 
      <itemType>Type5</itemType> 
    </items> 
    </brickTable> 
</NewDataSet> 

我想的是如圖所示的bricktable的一部分,但我無法弄清楚如何去做。我目前有上面的格式,但沒有任何部分。

我此刻的代碼如下:

  System.Data.DataSet ds; 
      ds = new DataSet(); 

      System.Data.DataTable tile_table; 
      tile_table = new DataTable("tiles"); 

      //add an auto increment column 
      DataColumn column1 = new DataColumn(); 
      column1.DataType = System.Type.GetType("System.Int32"); 
      column1.ColumnName = "value"; 
      column1.AutoIncrement = true; 
      tile_table.Columns.Add(column1); 

      //add index key 
      DataColumn[] keys = new DataColumn[1]; 
      keys[0] = column1; 
      tile_table.PrimaryKey = keys; 

      //tilemap data columns 
      DataColumn TileType = new DataColumn(); 
      TileType.DataType = System.Type.GetType("System.String"); 
      TileType.ColumnName = "Tile"; 
      tile_table.Columns.Add(TileType); 

      DataColumn X = new DataColumn(); 
      X.DataType = System.Type.GetType("System.Int32"); 
      X.ColumnName = "X"; 
      tile_table.Columns.Add(X); 

      DataColumn Y = new DataColumn(); 
      Y.DataType = System.Type.GetType("System.Int32"); 
      Y.ColumnName = "Y"; 
      tile_table.Columns.Add(Y); 

      DataRow row = tile_table.NewRow(); 
      row["value"] = count; 
      row["Tile"] = tileListRear[index].tileType.ToString(); 
      row["X"] = tileListRear[index].X; 
      row["Y"] = tileListRear[index].Y; 
      row["Layer"] = NewMapEditor.Layer.Rear.ToString(); 
      tile_table.Rows.Add(row); 

      //save xml file 
      ds.Tables.Add(infoTable); 
      ds.Tables.Add(tile_table); 
      ds.WriteXml(g_filename); 

感謝您的幫助!

回答

0

你不能像使用'DataSet.WriteXML'那樣得到一個XML文件。

您可以實現自己的自定義WriteXML函數,該函數從「ISerializeable」接口派生。如果您正在構建數據庫或希望對數據序列化方式進行很多控制,這可能是一個好主意。這是一個example on CodeProject

你真的需要DataTable有多糟?你打算使用SQL嗎?你需要關係嗎?

如果你的目標是,如你所說,生成準確的例子相匹配的XML文件,你可能想通過存儲類數據開始:

public class BrickTable 
{ 
    public int  Value { get; set; } 
    public string Title { get; set; } 
    public int  X  { get; set; } 
    public int  Y  { get; set; } 

    [XmlArrayItem("ItemType")] 
    public List<string> Items { get; set; } 

    public BrickTable() 
    { 
    } 
} 


注:項目可以是字符串列表,類型的列表,或您自己的自定義類:

public class Item 
{ 
    public string Name { get; set; } 
    public string Type { get; set; } 
    public int  Value { get; set; } 
    public Item() 
    { 
    } 
} 


而其序列化功能:

public void SerializeObject(string filename,object obj) 
{ 
    using(StreamWriter streamWriter = new StreamWriter(filename)) 
    { 
     XmlSerializer xmlSerializer = new XmlSerializer(obj.GetType()); 
     xmlSerializer.Serialize(streamWriter,obj); 
    } 
} 


用法:

void Test() 
{ 
    BrickTable bTable = new BrickTable(); 

    bTable.Title = ""; 
    bTable.Value = 23039; 
    bTable.X   = 18400; 
    bTable.Y   = 64; 


    List<string> items = new List<string>(); 
    items.Add("Item1"); 
    items.Add("Item5"); 

    bTable.Items = items; 

    SerializeObject("BrickSet.xml",bTable); 
} 

最後,你可以做一個函數,它接受一個數據行並返回一個填寫了BrickTable類,或者你可以使用反射將一個類轉換成一個DataTable,as shown here

所以問題是,你需要多大程度的XML格式化?它是否也需要以DataTable的形式出現?