【问题标题】:Saving MySql query to an XML file and avoiding duplicates将 MySql 查询保存到 XML 文件并避免重复
【发布时间】:2013-09-26 10:16:03
【问题描述】:

您好,我有以下将数据保存到 xml 文件的 c# 代码。

问题是它没有以我正在寻找的格式保存 xml,而且我似乎找不到获取它的方法。

C# 代码

string MyConString = "SERVER=localhost;" + "DATABASE=myvideos75;" + "UID=root;" + "PASSWORD=V0lc0m;";
string SQLSelect = "SELECT episode.idShow,tvshow.c00 as 'ShowName',episode.c12 as 'Season',XBMCPathReFact(episode.c18) as 'Path' FROM myvideos75.episode join tvshow on tvshow.idShow = episode.idShow where episode.c13 = 1 order by episode.idShow,episode.c12 ";
string _XMLFile = "test.xml";

MySqlConnection connection = new MySqlConnection(MyConString);
try
{
    MySqlCommand _MySqlSelect = new MySqlCommand(SQLSelect, connection);
    DataSet _DataSet1 = new DataSet("XBMC");
    MySqlDataAdapter _MySqlDataAdapter1 = new MySqlDataAdapter(_MySqlSelect);
    _MySqlDataAdapter1.Fill(_DataSet1,"Show");
    FileStream myFs = new FileStream(_XMLFile, FileMode.OpenOrCreate, FileAccess.Write);
    _DataSet1.WriteXml(myFs);
    myFs.Close();
}

catch (Exception ex)
{ MessageBox.Show(ex.Message.ToString()); }

它生成的 XML

<XBMC>
  <Show>
    <idShow>1</idShow>
    <ShowName>2 Broke Girls</ShowName>
    <Season>1</Season>
    <Path>\\10.0.0.3\tv\2 Broke Girls\Season1\</Path>
  </Show>
  <Show>
    <idShow>1</idShow>
    <ShowName>2 Broke Girls</ShowName>
    <Season>2</Season>
    <Path>\\10.0.0.3\tv\2 Broke Girls\Season 02\</Path>
  </Show>
  <Show>
    <idShow>31</idShow>
    <ShowName>Burn Notice</ShowName>
    <Season>2</Season>
    <Path>\\10.0.0.3\tv\Burn Notice\Season2\</Path>
  </Show>
  <Show>
    <idShow>31</idShow>
    <ShowName>Burn Notice</ShowName>
    <Season>3</Season>
    <Path>\\10.0.0.3\tv\Burn Notice\Season3\</Path>
  </Show>
 </XBMC>

我希望它生成这样的 XML。

<XBMC>
    <Show>
     <idShow>1</idShow>
     <ShowName>2 Broke Girls</ShowName>
     <Seasons>
        <Season>
         <Number>1</Number>
         <Path>\\10.0.0.3\tv\2 Broke Girls\Season1\</Path>
        </Season>
        <Season>
         <Number>2</Number>
         <Path>\\10.0.0.3\tv\2 Broke Girls\Season 02\</Path>
        </Season>
     </Seasons>
    </Show>
    <Show>
     <idShow>31</idShow>
     <ShowName>Burn Notice</ShowName>
     <Seasons>
        <Season>
         <Number>2</Number>
         <Path>\\10.0.0.3\tv\Burn Notice\Season2\</Path>
        </Season>
        <Season>
         <Number>3</Number>
         <Path>\\10.0.0.3\tv\Burn Notice\Season3\</Path>
        </Season>
     </Seasons>
     </Show>
</XBMC>

SQL select语句返回如下数据

感谢您的宝贵时间

【问题讨论】:

    标签: c# mysql sql xml


    【解决方案1】:

    好的,我设法找到了解决方案,也许它可以帮助其他有类似问题的人。 我添加了一些 cmets 来解释发生了什么。

    string MyConString = "SERVER=10.0.0.3;" + "DATABASE=myvideos75;" + "UID=xbmc;" + "PASSWORD=xbmc;";
    string SQLSelect = "SELECT tvshow.idShow as 'idShow',tvshow.c00 as 'ShowName',episode.c12 as 'Season',XBMCPathReFact(episode.c18) as 'Path' FROM myvideos75.episode join tvshow on tvshow.idShow = episode.idShow group by episode .idShow,episode.c12";
    
            try
            {if (File.Exists(_XMLFile))
                {File.Delete(_XMLFile);}
            }
    
            catch (Exception ex)
            { MessageBox.Show(ex.Message.ToString()); }
    
            MySqlConnection connection = new MySqlConnection(MyConString);
    
            try
            {
                MySqlCommand _MySqlSelect = new MySqlCommand(SQLSelect, connection);
                DataSet _DataSet1 = new DataSet("XBMC");
                MySqlDataAdapter _MySqlDataAdapter1 = new MySqlDataAdapter(_MySqlSelect);
                _MySqlDataAdapter1.Fill(_DataSet1,"Show");
    
                XDocument xdoc;
                XElement root;
                XElement tvshow;
                XElement TvShowElement;
    
                xdoc = new XDocument(new XElement("XBMC"));
                root = xdoc.XPathSelectElement("//XBMC");   
    
                // loop start fills stuff in 
    
                foreach (DataRow row in _DataSet1.Tables[0].Rows)
                {
                    // Test if the show exists if not create it and add all the Element
                    var ShowIDTest = xdoc.Element("XBMC").Elements("Show").Where(x => x.Element("idShow").Value.Equals(row["idShow"].ToString())).ToList();
    
                    if (ShowIDTest.Count < 1)
                    {
                        TvShowElement = new XElement("Show",
                                        new XElement("idShow", row["idShow"].ToString()),
                                        new XElement("ShowName", row["ShowName"].ToString()),
                                        new XElement("Seasons",
                                        new XElement("Season",
                                        new XElement("Number", row["Season"].ToString()),
                                        new XElement("Path", row["Path"].ToString()))));
                        root.Add(TvShowElement);
                    }
                    // The Show Exists , go to the show
                    else
                    {
                        string tvshowpath = "/XBMC/Show[idShow =\"" + row["idShow"].ToString() + "\"]";
                        tvshow = xdoc.XPathSelectElement(tvshowpath);
                        // Check if the show already has any season if not create it 
                        bool SeasonsTest = tvshow.Descendants("Seasons").Any();
                        if (!SeasonsTest)
                        {
                            TvShowElement = new XElement("Seasons",
                                            new XElement("Season",
                                            new XElement("Number", row["Season"].ToString()),
                                            new XElement("Path", row["Path"].ToString())));
    
                            tvshow.Add(TvShowElement);
                        }
                        // the show already has any season element so append the additional seasons
                        else
                        {
                            string tvshowseasonspath = "/XBMC/Show[idShow =\"" + row["idShow"].ToString() + "\"]/Seasons";
                            tvshow = xdoc.XPathSelectElement(tvshowseasonspath);
    
                            TvShowElement = new XElement("Season",
                                            new XElement("Number", row["Season"].ToString()),
                                            new XElement("Path", row["Path"].ToString()));
    
                            tvshow.Add(TvShowElement);
                        }
                      }
                   }
                // Save the XML File   
                xdoc.Save(_XMLFile);
                MessageBox.Show("done");
            }
            catch (Exception ex)
            { MessageBox.Show(ex.Message.ToString()); }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-05
      • 1970-01-01
      • 2011-08-25
      • 2014-02-20
      • 1970-01-01
      相关资源
      最近更新 更多