DataTable不支持架构推断

时间:2017-11-28 18:44:53

标签: c# xml winforms datatable

我的应用程序中有很多数据表,其中一些需要从xmls导入。除了一个readxml函数之外,每个readxml函数都运行良好。

以下是一些xml内容;

 <dtSysStat>
    <ST>2017-11-28T21:14:58+03:00</ST>
    <INST_ID>1</INST_ID>
    <RM>1.34</RM>
    <WM>0.04</WM>
    <RR>86</RR>
    <WR>2</WR>
    <TR>0</TR>
  </dtSysStat>

这是数据表结构;

dtSysStatTemp.Columns.Add("ST", typeof(DateTime));
dtSysStatTemp.Columns.Add("INST_ID", typeof(int));
dtSysStatTemp.Columns.Add("RM", typeof(double));
dtSysStatTemp.Columns.Add("WM", typeof(double));
dtSysStatTemp.Columns.Add("RR", typeof(double));
dtSysStatTemp.Columns.Add("WR", typeof(double));
dtSysStatTemp.Columns.Add("TR", typeof(double));

这是阅读部分;

dtSysStatTemp.TableName = "dtSysStat";
dtSysStatTemp.ReadXml(AppDomain.CurrentDomain.BaseDirectory + pathnameicustom);

我还从dtsysstat数据表结构中编写了这个xml。所以我确信架构结构是一样的。

我不知道为什么我得到'DataTable不支持架构推断'错误。因为readxml的所有其他数据表都可以正常工作。

我想在不使用数据集

的情况下执行此操作

2 个答案:

答案 0 :(得分:1)

您可以使用数据集尝试以下操作。

DataSet ds = new DataSet();
ds.ReadXml("testfile.xml");
DataTable dt = ds.Tables["dtSysStat"];
return dt.Rows[0]["ST"].ToString();

Alt解决方案(添加ReadXmlSchema):

dtSysStatTemp.TableName = "dtSysStat";
dtSysStatTemp.ReadXmlSchema(AppDomain.CurrentDomain.BaseDirectory + pathnameicustom);
dtSysStatTemp.ReadXml(AppDomain.CurrentDomain.BaseDirectory + pathnameicustom);

答案 1 :(得分:0)

  1. 确保您的标签中没有空格,例如:
    错误< ST > < /ST> 正确<ST> </ST>
  2. 使用DataSet而非DataTable - DataTable不支持架构 来自Xml的推论。
  3. 我测试了它,它按预期工作:

    private void XmlToDataset() 
    {
        DataSet dsysStatTemp = new DataSet();
        XmlDocument doc = new XmlDocument();
        string xmlString = @"<dtSysStat>
         <ST> 2017 - 11 - 28T21: 14:58 + 03:00 </ST>
         <INST_ID> 1 </INST_ID>
         <RM> 1.34 </RM>
         <WM> 0.04 </WM>
         <RR> 86 </RR>
         <WR> 2 </WR>
         <TR> 0 </TR>
         </dtSysStat>";
    
        doc.Load(new StringReader(xmlString));
    
        XmlTextReader xtr = new XmlTextReader(doc.OuterXml, XmlNodeType.Element, null);
        dsysStatTemp.ReadXml(xtr);
        MessageBox.Show(dsysStatTemp.Tables[0].Rows[0]["ST"].ToString());
    }