XML到DataTable

时间:2011-03-11 15:55:42

标签: c# xml-serialization datatable

我已尝试使用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>

我觉得它与我的表格结构有关,但我不确定它在哪里不正确。

感谢您提供任何帮助

2 个答案:

答案 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;
    }
}