2016-11-09 7 views
0

У меня есть следующий XML-файлуПреобразование XML в Dataset или 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, где у меня есть три вкладки в нижней части. каждый для каждого автомобиля, поэтому один для Toyota, один для Mazda и один для Honda. На каждой вкладке я хотел бы иметь таблицу с данными для каждого автомобиля, так как все автомобили с одинаковым именем будут иметь одинаковое количество атрибутов. 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-схемы, но я не знаю, как использовать, что в моем случае. thanks

ответ

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

Это дает заполненный набор данных.