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 ファイルを取得することはできません。

「ISerializeable」インターフェイスから派生する独自のカスタム WriteXML 関数を実装できます。これは、データベースを構築している場合や、データのシリアライズ方法を細かく制御したい場合に適しています。これは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 に答える