0

我试图为一个大学项目创建一个页面,该页面从存储在 Mysql 数据库中的数据中动态显示 Flash 播放器中的视频列表。我已经让播放器从一个简单的 XML 列表正确运行,但我需要从数据库中获取正确的数据并将其转换为 XML 列表,以根据当前选择的视频显示播放列表。

XML 列表如下所示:

 <?xml version="1.0" encoding="utf-8"?> 
<item> 
   <list name="A really awesome video of Declan's face." videotitle="Declan Video" link="0001.flv" > 
       <thumb>thumb/1.jpg</thumb> 
   </list> 
   <list name="Test content - Video of Wenlong and Jing" videotitle="Final matrix demo 2" link="test1.flv" > 
       <thumb>thumb/2.jpg</thumb> 
   </list> 
   <list name="Video of Wenlong and Jing" videotitle="Matrix film demo 1" link="test2.flv" > 
       <thumb>thumb/1.jpg</thumb> 
   </list> 
   <list name="Video of Wenlong and Jing" videotitle="Final matrix demo 2" link="test4.flv" > 
       <thumb>thumb/2.jpg</thumb> 
   </list> 
   <list name="Video of Wenlong and Jing" videotitle="Matrix film demo 1" link="wenlong1.flv" > 
       <thumb>thumb/1.jpg</thumb> 
   </list> 

   </list> 


</item>

关于如何最好地实现这一目标的任何想法?帮助将不胜感激。

谢谢!

4

1 回答 1

1

您是否尝试过使用结果集中的 XDocument 手动创建 XML 文件?

现在您还没有提供任何从 MySql 服务器中获取数据的示例代码,或者没有提供用于读取 mysql 数据存储的参数的示例。只需很少的信息就可以真正为您提供一个基本方法,该方法采用数据表(具有特定列名)并返回一个简单的格式化 xml 文档。

public static XDocument CreatePlaylist(System.Data.DataTable DataTable)
        {
            var xDoc = new XDocument(new XDeclaration("1.0", "utf-8", "yes"));
            var xItem = new XElement("item");
            foreach (var row in DataTable.Rows.OfType<System.Data.DataRow>())
                xItem.Add(new XElement("list",
                            new XAttribute("name", row["name"].ToString()),
                            new XAttribute("videotitle", row["videotitle"].ToString()),
                            new XAttribute("link", row["link"].ToString()),
                            new XElement("thumb", row["thumb"].ToString())));
            xDoc.Add(xItem);
            return xDoc;
        }

这个小片段很简单,它只是接受数据表作为参数,然后为您创建一个 XDocument。现在要求数据表必须具有列名称、视频标题、链接和拇指。

现在继续前进,您可以简单地调用此方法,该方法将返回 XDocument 对象,从那里调用 XDocument 的 .ToString() 方法将为您提供 xml。但是有一个问题(总是有一个问题)。调用 .ToString() 方法时,XDocument 不包括 Xml 声明。如果您调用 .Save() 方法,它将输出 Xml 声明。

我有另一个简单的方法,它允许您将 XDocument 输出到 Xml 声明完整的字符串。该方法如下。

public static string XDocToStringWithDeclaration(XDocument doc)
        {
            string xString;
            using (var sw = new System.IO.MemoryStream())
            {
                using (var strw = new System.IO.StreamWriter(sw, System.Text.UTF8Encoding.UTF8))
                {
                    doc.Save(strw);
                    xString = System.Text.UTF8Encoding.UTF8.GetString(sw.ToArray());
                }
            }
            return xString;
        }

您会看到该方法将调用 xDocument 的 Save() 方法,但是会将其保存到 MemoryStream 中,然后将 memorystream 作为字符串输出。

现在要将它们联系在一起,我有一个简单的控制台应用程序,您可以查看并了解它们是如何组合在一起的。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            var dt = new System.Data.DataTable();
            dt.Columns.Add("name");
            dt.Columns.Add("videotitle");
            dt.Columns.Add("link");
            dt.Columns.Add("thumb");

            for (int i = 0, j = 5; i <= j; i++)
            {
                var row = dt.NewRow();
                row["name"] = string.Format("video {0}", i);
                row["videotitle"] = string.Format("video {0}", i);
                row["link"] = string.Format("/someurl/video{0}.avi", i);
                row["thumb"] = string.Format("/someurl/video{0}.png", i);
                dt.Rows.Add(row);
            }
            var xmlDoc = CreatePlaylist(dt);

            Console.WriteLine(XDocToStringWithDeclaration(xmlDoc));


            Console.WriteLine("{0}Finished... Press a key", Environment.NewLine);
            Console.ReadKey();

        }

        public static string XDocToStringWithDeclaration(XDocument doc)
        {
            string xString;
            using (var sw = new System.IO.MemoryStream())
            {
                using (var strw = new System.IO.StreamWriter(sw, System.Text.UTF8Encoding.UTF8))
                {
                    doc.Save(strw);
                    xString = System.Text.UTF8Encoding.UTF8.GetString(sw.ToArray());
                }
            }
            return xString;
        }

        public static XDocument CreatePlaylist(System.Data.DataTable DataTable)
        {
            var xDoc = new XDocument(new XDeclaration("1.0", "utf-8", "yes"));
            var xItem = new XElement("item");
            foreach (var row in DataTable.Rows.OfType<System.Data.DataRow>())
                xItem.Add(new XElement("list",
                            new XAttribute("name", row["name"].ToString()),
                            new XAttribute("videotitle", row["videotitle"].ToString()),
                            new XAttribute("link", row["link"].ToString()),
                            new XElement("thumb", row["thumb"].ToString())));
            xDoc.Add(xItem);
            return xDoc;
        }
    }
}

我希望这有帮助。

干杯,尼科

于 2012-05-16T06:26:02.473 回答