2009-12-20 18 views
30
<?xml version="1.0" encoding="utf-8"?> 
<PHP_Adapter> 
    <Adapter> 
    <ID>11</ID> 
    <Provider>22</Provider> 
    <Connectstring>33</Connectstring> 
    </Adapter> 
</PHP_Adapter> 

這是我的Xml文件有什麼問題?DataTable不支持來自Xml的模式推斷。

bool CheckAdapterExist(string aid) 
    { 
     DataTable dt = new DataTable(); 
     dt.ReadXml(axml); 
     MessageBox.Show(dt.Rows[0]["ID"].ToString()); 

     return true; 
    } 

回答

45

使用數據集

DataSet ds = new DataSet(); 
ds.ReadXml(@"d:\test.xml"); 
MessageBox.Show(ds.Tables[0].Rows[0]["ID"].ToString()); 

DataTable.ReadXml(filename) throws an error. Why?

+0

我認爲,問題涉及到一個表,而不是數據集。另外,正確的方法是將模式添加到自定義表。 – fcm 2016-05-09 22:19:02

4

試試這個發現的嘗試,這將工作:

System.Xml.XmlTextReader reader = 
       new System.Xml.XmlTextReader(@"C:\Users\Mayank\Documents\Projects\XMLTEST\XMLTEST\XMLFile1.xml"); 
      DataSet newTable = new DataSet(); 
      newTable.ReadXml(reader); 
      DataTable _dt=newTable.Tables[0]; 
7

這工作

 string XML = @" 
      <MyTable> 
      <MyRecord> 
       <Col_1>test</Col_1> 
       <Col_2>1234</Col_2> 
      </MyRecord> 
      <MyRecord> 
       <Col_1>Record 2</Col_1> 
       <Col_2>2</Col_2> 
      </MyRecord> 
      </MyTable> 
     "; 
     DataSet DS = new DataSet(); 
     DS.ReadXml(new StringReader(XML)); 

     DataTable DT=DS.Tables[0]; 
0

好的,這是一個「我也是!」回答,但是上面的答案都沒有解決問題的實質。

要妥善處理這一問題,首先讓數據表通過調用ReadXmlSchema方法推斷從XML架構,即

bool CheckAdapterExist(string aid) 
{ 
    DataTable dt = new DataTable(); 
    dt.ReadXmlSchema(axml); 
    dt.ReadXml(axml); 
    MessageBox.Show(dt.Rows[0]["ID"].ToString()); 

    return true; 
} 

通過這種方式,該模式從XML infered你正在嘗試加載並且沒有錯誤發生!

+2

這仍會引發相同的異常「DataTable不支持從Xml進行模式推斷」。 – bouvierr 2013-02-16 15:06:51

29

如果您正在從DataTable.WriteXML中閱讀XML文件,請確保您包括的文件XMLWriteMode.WriteSchema

例子:

Table.WriteXml(DataFilePath, XmlWriteMode.WriteSchema); 
+1

如果ReadXml需要它,你會認爲它應該默認編寫模式!謝謝。 – CathalMF 2016-03-31 08:45:36

+0

謝謝馬克!這應該被標記爲實際答案。除非包含在原始導出中,否則DataTable不知道該模式。解決此問題的另一種方法是在創建DataTable對象時手動創建模式,然後從XML讀入數據。 – 2017-07-28 21:05:42