我已尝试使用stream,ReadXml等在响应中列出的各种方法,并且我得到相同的结果(没有添加行)。我很确定我的DataTable结构有问题。
DataTable代码(构建结构并返回结构的函数的内容):
DataTable dt = new DataTable();
dt.Columns.Add("Item");
dt.Columns.Add("Access1");
dt.Columns.Add("Access2");
dt.Columns.Add("Access3");
dt.Columns.Add("Access4");
dt.Columns.Add("Access5");
dt.TableName = "Permission";
return dt;
我已尝试在Add参数中设置typeof(string)(以匹配架构),但这对它没有帮助。
DataTable架构:
<?xml version="1.0" standalone="yes"?>
<NewDataSet>
<xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:MainDataTable="Permission" msdata:UseCurrentLocale="true">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="Permission">
<xs:complexType>
<xs:sequence>
<xs:element name="Item" type="xs:string" minOccurs="0" />
<xs:element name="Access1" type="xs:string" minOccurs="0" />
<xs:element name="Access2" type="xs:string" minOccurs="0" />
<xs:element name="Access3" type="xs:string" minOccurs="0" />
<xs:element name="Access4" type="xs:string" minOccurs="0" />
<xs:element name="Access5" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
</NewDataSet>
XML进入:
<?xml version="1.0" encoding="utf-16"?>
<Permissions>
<Permission>
<Item>Process 1</Item>
<Access1>True</Access1>
<Access2>True</Access2>
<Access3>False</Access3>
<Access4>False</Access4>
<Access5>False</Access5>
</Permission>
<Permission>
<Item>Process 2</Item>
<Access1>True</Access1>
<Access2>True</Access2>
<Access3>True</Access3>
<Access4>False</Access4>
<Access5>False</Access5>
</Permission>
</Permissions>
我觉得它与我的表格结构有关,但我不确定它在哪里不正确。
感谢您提供任何帮助
答案 0 :(得分:1)
将DataTable
附加到DataSet
,XML序列化数据集。 DataSet
是xml可序列化的; DataTable
不是。
示例程序以显示其工作原理:
class Program
{
static void Main(string[] args)
{
DataTable dt = new DataTable();
dt.Columns.Add("Item");
dt.Columns.Add("Access1");
dt.Columns.Add("Access2");
dt.Columns.Add("Access3");
dt.Columns.Add("Access4");
dt.Columns.Add("Access5");
dt.TableName = "Permission";
for (int i = 0; i < 6; i++)
{
var row = dt.NewRow();
row["Item"] = i;
row["Access1"] = (i % 2 == 0 ? true : false);
row["Access2"] = (i % 2 == 0 ? true : false);
row["Access3"] = (i % 3 == 0 ? true : false);
row["Access4"] = (i % 3 == 0 ? true : false);
row["Access5"] = (i % 4 == 0 ? true : false);
dt.Rows.Add(row);
}
dt.AcceptChanges();
DataSet ds = new DataSet("Permissions");
ds.Tables.Add(dt);
var output = Console.OpenStandardOutput();
ds.WriteXml(output);
Console.ReadLine();
}
}
答案 1 :(得分:0)
上面有关于需要在DataSet中使用它的code4life的解释,我把它付诸行动:
DataTable table = CreatePermissionTable(); // uses the c# code listed in question
DataSet ds = new DataSet();
ds.Tables.Add(table);
try
{
using(Stream stream = new FileStream(file, FileMode.Open, FileAccess.Read))
{
ds.ReadXml(stream);
table = ds.Tables["Permission"];
return table;
}
}