2016-11-09 4 views
0

私は次のXMLファイルコンバートXML

<rootTag Type="TheRootType" CollectionTime="2016-02-06T" secretNumber="12345"> 
    <Toyota Type="Car"> 
    <item Name="EToyotaID" Valuetype="System.Int32">1</item> 
    <item Name="EIdentifier" Valuetype="System.String">KKPP</item> 
    <item Name="THEID" Valuetype="System.Int32">0</item> 
    <item Name="TheValue" Valuetype="System.Int32">5040</item> 
    <item Name="Num" Valuetype="System.String">1104</item> 
    </Toyota> 
    <Toyota Type="Car"> 
    <item Name="EToyotaID" Valuetype="System.Int32">2</item> 
    <item Name="EIdentifier" Valuetype="System.String">PPLL</item> 
    <item Name="THEID" Valuetype="System.Int32">0</item> 
    <item Name="TheValue" Valuetype="System.Int32">3230</item> 
    <item Name="Num" Valuetype="System.String">1104</item> 
    </Toyota> 
    <Mazda Type="Car"> 
    <item Name="EMazdaID" Valuetype="System.Int32">1130</item> 
    <item Name="EIdentifier" Valuetype="System.String">RRR</item> 
    <item Name="TheValue" Valuetype="System.Int32">10</item> 
    <item Name="Num" Valuetype="System.String">1104</item> 
    </Mazda> 
    <Mazda Type="Car"> 
    <item Name="EMazdaID" Valuetype="System.Int32">1131</item> 
    <item Name="EIdentifier" Valuetype="System.String">SetTemp</item> 
    <item Name="TheValue" Valuetype="System.Int32">7</item> 
    <item Name="Num" Valuetype="System.String">1104</item> 
    </Mazda> 
    <Honda Type="Car"> 
    <item Name="EHondaID" Valuetype="System.Int32">1726</item> 
    <item Name="EIdentifier" Valuetype="System.String">SetUp</item> 
    <item Name="THEID" Valuetype="System.Int32">11</item> 
    <item Name="IDNum" Valuetype="System.Int32">13</item> 
    <item Name="TheValue" Valuetype="System.Int32">327</item> 
    <item Name="Num" Valuetype="System.String">1104</item> 
    </Honda> 
    <Honda Type="Car"> 
    <item Name="EHondaID" Valuetype="System.Int32">1727</item> 
    <item Name="EIdentifier" Valuetype="System.String">SetUp</item> 
    <item Name="THEID" Valuetype="System.Int32">11</item> 
    <item Name="IDNum" Valuetype="System.Int32">14</item> 
    <item Name="TheValue" Valuetype="System.Int32">327</item> 
    <item Name="Num" Valuetype="System.String">1104</item> 
    </Honda> 
</rootTag> 

を持っています。トヨタ用、マツダ用、ホンダ用。各タブでは、同じ名前のすべての車が同じ数の属性を持つので、各車のデータが入ったテーブルを用意したいと思います。 xmlからデータセットを取得しようとしましたが、正しく動作していないようです。 は、データセットで私はまた、XMLスキーマを持っていますが、私は私の場合、それを利用するためにどのように確認していない以下の5つの表

1) rootTag 
2) Toyota <= only has 2 columns "car" and "0" 
3) item <== it has all the data I need but it is a mess 
4) Mazda <= only has 2 columns "car" and "0" 
5) Honda <= only has 2 columns "car" and "0" 
here is the code I used 






public static DataSet ConvertXMLToDataSet(string xmlData) 
    { 
     StringReader stream = null; 
     XmlTextReader reader = null; 
     try 
     { 
      DataSet xmlDS = new DataSet("rootTag"); 
      stream = new StringReader(xmlData); 
      // Load the XmlTextReader from the stream 
      reader = new XmlTextReader(stream); 
      xmlDS.ReadXml(reader); 
      return xmlDS; 
     } 
     catch 
     { 
      return null; 
     } 
     finally 
     { 
      if (reader != null) reader.Close(); 
     } 
    }// Use 


} 

を得ました。 ありがとう

答えて

3

設定ファイルなどのXMLファイルをエクスポート(および読み込み)するためにデータセットを使用します。私はStringReaderの代わりにStreamReaderを使用する以外は、ロードコードはOKです。あなたのXMLはどのように作成されましたか?投稿したXMLはデータセット/テーブルにインポートされません。 XMLノードをループして、あらかじめ構築されたデータセットに値を追加することをお勧めします。次に、下のコードを使用して正しいスキーマを作成することができます。

dsRelease _Data = null; // Dataset. 

    private void Load_Data() 
    { 
     StreamReader sr; 
     XmlReader reader; 

     _Data = new dsRelease(); //new dataset 

     sr = new StreamReader(_SavePath, Encoding.UTF8); 
     reader = new XmlTextReader(sr); 

     _Data.ReadXml(reader, XmlReadMode.ReadSchema); 

     if (reader != null) reader.Close(); 
     if (sr != null) sr.Close(); 
    } 

    public void Save_Data(string savepath) 
    { 
     XmlTextWriter writer = null; 

     writer = new XmlTextWriter(savepath, Encoding.UTF8); 

     //Write Dataset. 
     _Data.WriteXml(writer, XmlWriteMode.WriteSchema); 
    } 
1

このコードを試してみてください。

var ds = new DataSet(); 
var xml = XElement.Load("test.xml"); 

var cars = xml.Elements().GroupBy(elem => elem.Name, elem => elem.Elements()); 

foreach (var car in cars) 
{ 
    var dt = new DataTable(car.Key.LocalName); 

    foreach (var elem in car.First()) 
    { 
     dt.Columns.Add(elem.Attribute("Name").Value, 
      Type.GetType(elem.Attribute("Valuetype").Value)); 
    } 

    foreach (var elem in car) 
    { 
     dt.Rows.Add(elem.Select(x => x.Value).ToArray()); 
    } 

    ds.Tables.Add(dt); 
} 

それはあなたに満たされたデータセットを提供します。