我是 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);
感谢您的帮助!
最佳答案
您无法通过使用“DataSet.WriteXML”获得这样的 XML 文件。
您可以实现您自己的自定义 WriteXML 函数,该函数派生自“ISerializeable”接口(interface)。如果您正在构建数据库或想要对数据的序列化方式进行大量控制,这可能是个好主意。这是一个 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()
{
}
}
注意:Item可以是字符串列表,Type列表,也可以是你自定义的类:
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的形式?
关于C# xml : How to save nested rows,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17287052/