2013-02-24 80 views
0

我正在试图将此xml信息导入到表中。 我试图读取XML到数据集...将xml数据导入数据集

  string myXMLfile = @"..\..\..\BR7.xml"; 

     //http://tatts.com/pagedata/racing/2011/10/5/BR7.xml 
     //http://tatts.com/racing/2011/10/5/BR/7 

     DataSet ds = new DataSet(); 
     try 
     { 
      ds.ReadXml(myXMLfile); 


      for (int i = 0; i < ds.Tables.Count; i++) 
      { 
       listBox1.Items.Add(ds.Tables[i].TableName); 
      } 

      dgvRunner.DataSource = ds; 
      dgvRunner.DataMember = "Runner"; 

      dgvWinOdds.DataSource = ds; 
      dgvWinOdds.DataMember = "WinOdds"; 

      dgvPlaceOdds.DataSource = ds; 
      dgvPlaceOdds.DataMember = "PlaceOdds"; 

      dgvFixedOdds.DataSource = ds; 
      dgvFixedOdds.DataMember = "FixedOdds"; 

,但我得到四个独立的表。 Runner,WinOdds,PlaceOdds和fixedOdds 如何将跑步者的所有信息放入单个表中?

下面是一些XML的...

-<Runner RunnerNo="1" Rtng="93" LastResult="0X1" Form="W" Weight="57.0" Handicap="0" Barrier="10" RiderChanged="N" Rider="P SCHMIDT(A)" Scratched="N" RunnerName="PREACHER BOY"> 
<WinOdds CalcTime="2011-10-05T16:51:07" LastCalcTime="2011-10-05T16:46:32" Short="N" Lastodds="11.50" Odds="10.70"/> 
<PlaceOdds Short="N" Lastodds="3.50" Odds="3.30"/> 
-<FixedOdds RaceDayDate="2011-10-05T00:00:00" MeetingCode="BR" RaceNo="07" RunnerNo="01" LateScratching="0" Status="w" OfferName="PREACHER BOY" RetailPlaceOdds="3.3500" RetailWinOdds="12.0000" PlaceOdds="3.3500" WinOdds="12.0000" OfferId="981020"><Book SubEventId="863449" BookStatus="F"/> 
</FixedOdds> 
</Runner> 

回答

0

您有关于RunnerNo在每一个表中的信息(这是缺少WinOdd和PlaceOdds),这样就可以与你的四个数据表。您可以将RunnerNo定义为唯一

之后,您只使用一个gridview并将四个数据表之间的关系作为gridview的DataMember进行分配。

这里的关系应该怎么看起来像

0

我建议移动Runner儿童的所有属性的方法一sample属性为Runner节点属性集合。这利用了以下假设:

  1. Runner节点的每个嵌套元件在其内部具有最大1个嵌套元素(即只有一个Book所述FixedOdds元件内部元件)
  2. 的属性将通过前缀来重命名他们发起节点的名称
  3. 您可以保留或删除其子节点(在WinOdds元素的CalcTime属性将在Runner属性的集合名称为WinOddsCalcTime复制)(我选择删除它们的代码示例中)

下面的代码:

string myXMLfile = @"xml.xml"; 

    DataSet ds = new DataSet(); 

    try 
    { 

     XmlDocument doc = new XmlDocument(); 
     doc.Load(myXMLfile); 

     var runners = doc.SelectNodes("/Runner"); 

     foreach (XmlNode runner in runners) 
     { 
      foreach (XmlNode child in runner.ChildNodes) 
      { 
       for (int i = 0; i < child.Attributes.Count; i++) 
       { 
        var at =doc.CreateAttribute(child.Name + child.Attributes[i].Name); 
        at.Value=child.Attributes[i].Value; 
        runner.Attributes.Append(at); 
       } 
       if (child.Name == "FixedOdds") 
       { 
        foreach (XmlNode book in child.ChildNodes) 
        { 
         for (int i = 0; i < book.Attributes.Count; i++) 
         { 
          var at = doc.CreateAttribute(book.Name + book.Attributes[i].Name); 
          at.Value = book.Attributes[i].Value; 
          runner.Attributes.Append(at); 
         } 
        } 
       } 

       // delete the attributes and the children nodes 
       child.RemoveAll(); 
      } 

      // delete the child noeds 
      while (runner.ChildNodes.Count > 0) 
      { 
       runner.RemoveChild(runner.ChildNodes[0]); 
      } 
     } 


     doc.Save("xml1.xml"); 

     ds.ReadXml("xml1.xml"); 

     for (int i = 0; i < ds.Tables.Count; i++) 
     { 
      listBox1.Items.Add(ds.Tables[i].TableName); 
     } 

     dgvRunner.DataSource = ds; 
     dgvRunner.DataMember = "Runner"; 

     //dgvWinOdds.DataSource = ds; 
     //dgvWinOdds.DataMember = "WinOdds"; 

     //dgvPlaceOdds.DataSource = ds; 
     //dgvPlaceOdds.DataMember = "PlaceOdds"; 

     //dgvFixedOdds.DataSource = ds; 
     //dgvFixedOdds.DataMember = "FixedOdds"; 
    } 
    catch (Exception) 
    { } 
     } 
    }