2017-11-28 71 views
0

私のアプリケーションには多くのdatatableがあり、そのうちのいくつかはxmlsからインポートする必要があります。すべてのreadxml関数は、1つを除いてうまく機能します。DataTableはスキーマの推論をサポートしていません

ここにいくつかの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> 

ここにdatatable構造体があります。

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

ここには読んでいるセクションがあります。

また、このxmlをdtsysstatデータテーブル構造から書きます。私はスキーマ構造が同じであると確信しています。

なぜ私は 'DataTableがスキーマの推論をサポートしていません'というエラーを表示しません。 readxmlの他のデータテーブルはすべて完全に動作するからです。

は、私はあなたが例えば、あなたのタグにホワイトスペースを持っていけないことを確認してくださいデータセット

+1

は、なぜ最初の場所でのDataTableを使用できますか?なぜ強く型付けされたオブジェクトではないのですか? – mason

+0

DataSet WriteXmlとDataTable WriteXmlには若干の違いがあります。 DataSetは常に動作します。 DataTableは、DataTableに名前がある場合にのみ機能します。私に理由を聞かないで。 DataSetを読み取るとき、最初のレベルタグはDataSet名です。 2番目のレベルのタグはDataTableの名前です。第3レベルのタグは列名です。第4レベルのタグは行データです。 4つ以上のレイヤーを持つ場合、ネットライブラリはデータを無用な多くのデータテーブルに分割します。同じファイルをDataTableとして読み込もうとすると、複数のデータテーブルを作成できないため、不可能になります。 – jdweng

答えて

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); 
+0

私はデータセットを使いたくありません。 –

+2

人々はあなたを助けるために努力と時間をかけている、私は "私はデータセットを使用したくない"と考えていますが、理由を説明してください。 – jonathana

+0

ReadXmlの直前でReadXmlSchemaを使用している場合は、違いがありますか?私は例で私の答えを更新しました。 – Sulphy

0
  1. を使用せずにこれをしたい:
    間違っ<ST> </ST><ST> < /ST>正しいです。
  2. DataSetDataTable - DataTableはXmlのスキーマ のスキーマをサポートしていません。

私はそれをテストしているし、期待どおりに動作します:

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()); 
} 
+0

しかし、私はデータセットを使用せずに他のすべてのデータを使用することができます。 –

+0

あなたのコメントを理解できませんでした。また、私は人々が理由を説明することを望みます。 – jonathana

関連する問題