XML в DataTable - PullRequest
       38

XML в DataTable

0 голосов
/ 11 марта 2011

Я пробовал различные методы, перечисленные в ответах, используя 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;

Я пробовал это с установкой typeof (string) в параметрах Add (чтобы соответствовать схеме), но это не помогло.

Схема 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 ]

1 голос
/ 11 марта 2011

Присоедините 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();
    }
}
0 голосов
/ 11 марта 2011

С объяснением 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;
    }
}
...