簡體   English   中英

將MySql查詢保存到XML文件並避免重復

[英]Saving MySql query to an XML file and avoiding duplicates

嗨,我有以下c#代碼將數據保存到xml文件中。

問題在於它不會以我正在尋找的格式保存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語句返回以下數據

在此處輸入圖片說明

感謝您的時間

好吧,我設法找到了一個解決方案,也許它可以幫助其他遇到類似問題的人。 我添加了一些評論來解釋發生了什么。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM