2011-03-11 46 views
0

我已經嘗試過使用流,ReadXml等在這裏的響應中列出的各種方法,我得到了相同的結果(沒有添加行)。我很確定這是我的DataTable結構中的錯誤。XML到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運算(字符串)試了一下,但沒沒有幫助。

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> 

我有一種感覺它與我的表結構的事,但我不能確定它是不正確。

感謝您的幫助,您可以給

回答

1

附上DataTableDataSet和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

我做了一個變化在這個,但使用或多或少你做了什麼。我會添加我的修改以防萬一它幫助某人。謝謝。 – Robert 2011-03-11 16:12:14

0

隨着code4life的解釋,上述約需要有它在DataSet,我把它改成這樣的動作:

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