2

我是 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>

如图所示,我希望成为砖桌的一部分,但我不知道该怎么做。我目前有上面的格式,但没有任何部分。

我目前的代码如下:

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

谢谢你的帮助!

4

1 回答 1

0

您无法通过使用“DataSet.WriteXML”获得这样的 XML 文件。

您可以实现自己的自定义 WriteXML 函数,该函数派生自“ISerializeable”接口。如果您正在构建数据库或想要对数据的序列化方式进行大量控制,这可能是一个好主意。这是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,如下所示

所以问题是,您需要以这种方式格式化您的 XML 有多严重?它是否也需要采用 DataTable 的形式?

于 2013-07-21T02:52:39.087 回答