2016-11-09 68 views
0

我有下面的XML文件转换XML到数据集或Excel表格

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

我想写这,我在底部三个选项卡Excel文件。每辆车都有一辆,丰田,马自达和本田都有一辆。在每个选项卡中,我希望为每辆车配备一张数据表,因为所有具有相同名称的汽车都具有相同数量的属性.a 我试图从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 


} 

我也有XML架构,但我不知道如何使用的,在我的情况。 谢谢

回答

3

我使用数据集来导出(和加载)XML文件,例如配置文件等。加载代码看起来不错,除了我使用StreamReader而不是StringReader。你的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); 
} 

它给你一个充满数据集。