2011-10-18 54 views
3

我有一個datagridview填充了來自.xml文件的數據。數據是MyObjects的列表,其中MyObject是我擁有的C#類。這最初是沒有模式,所以沒有類型的信息:(意味着我沒有得到自動生成的複選框列的bools等MyObject類的好處將XML模式和數據加載到數據集(和datagridview)

所以我用xsd.exe來生成。.xsd文件看起來不錯,但我怎麼部署此的.xsd與應用我必須確保它坐落在同一個目錄中我的應用程序並加載它喜歡!?

DataSet ds = new DataSet(); 
ds.ReadXml("mystuff.xml"); 
ds.ReadXmlSchema("myschema.xsd"); 
dataGridView_1.DataSource = ds; 
dataGridView_1.DataMember = "MyObject"; 

我肯定有更好的方法來處理這個...我可以將它作爲程序集的一部分或其他東西嗎?謝謝你的幫助。

回答

5

使它成爲一個嵌入式的強類型資源

將文件添加到您的項目併爲其提供「內容」和「不要複製」的構建操作。然後打開資源設計器選項卡(從屬性文件夾或項目屬性對話框中)並將文件拖到資源設計器畫布上。該文件現在嵌入到您的程序集中。這將產生默認Resources類的強類型屬性,其名稱與其來自的文件相同。

要加載到數據集中,您可以將StringReader連接到它。請注意,你幾乎總是要首先加載架構,因爲它改變了ReadXml行爲:

var ds = new DataSet(); 
using (var rdr = new StringReader(Properties.Resources.myschema)) 
{ 
    ds.ReadXmlSchema(rdr); 
} 
ds.ReadXml("mystuff.xml", XmlReadMode.IgnoreSchema); 

對於XmlReadMode你有幾個選項。他們決定,如果你的數據不匹配您的架構,以及是否有從您已經加載了一個不同的XML文件中聯定義一個模式做什麼,會發生什麼:

  • XmlReadMode.ReadSchema將導入任何內聯架構作爲只要它不與已經加載的模式相沖突;如果有名稱衝突,則會拋出ReadXml;或
  • XmlReadMode.IgnoreSchema將忽略任何內聯模式,並嘗試強制數據到您指定的模式。在這種模式下,與您的模式不匹配的數據將以而不是結束於數據集中。
  • XmlReadMode.InferSchema將忽略任何內聯模式,但在這種情況下,任何不符合您的模式的數據都會導致您的模式被擴展;例如,如果您的XML文件具有不在您的模式中的表,那麼該表將被添加到您的模式並導入數據。如果不同類型的列之間存在名稱衝突,則會拋出ReadXml;

如果你做的ReadXml第一,你總是ReadSchema模式,如果有一個內聯架構,或InferSchema模式如果不存在。即使這是你想要的,最好清楚一點。

+0

哇。殺死它。很簡單。謝謝!! – akevan

+0

我發現即使在readxml()之前調用readschema(),XmlReadMode.IgnoreSchema也不會工作。這個出現是使用我自己的或上面的代碼的情況。 xml文件中但未在模式文件中列出的任何元素都會以靜默方式添加到數據集中。 – Canacourse