数据库中的所有表之间是用主键,外键联系起来,怎样可以将这些关系提取出来用XML文件表示?

解决方案 »

  1.   

    关系是多对多的的图,XML是分层的树,不好表示吧
      

  2.   

    我也不知道,我们做毕业设计,那老师叫我们这样做。网站上也没见谁这样做过。两张表的可以表示吗?比如Northwind数据库里的Order Details与Orders表的关系?
      

  3.   

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Xml;
    using ShootSearch.Spider.Http;
    using System.IO;
    using ShootSearch.Common;
    using System.Collections;
    using System.Data;
    using System.Windows.Forms;namespace ShootSearch.Spider
    {
        /// <summary>
        /// 
        /// </summary>
        public class Util
        {
            #region 加载任务列表
            /// <summary>
            /// 加载任务列表
            /// </summary>
            /// <returns></returns>
            public static URL[] LoadTasks()
            {
                string taskList = Tools.StartPath + "\\Settings\\Task.xml";
                if (!File.Exists(taskList)) return null;
                XmlDocument doc = new XmlDocument();
                try
                {
                    doc.Load(taskList);
                    XmlNodeList list = doc.SelectNodes("ShootSearch/Task/Item");
                    List<URL> urls = new List<URL>();
                    foreach (XmlNode node in list)
                    {
                        URL url = new URL();
                        url.Url = new Uri(XMLSettings.GetXmlNodeText(node, "", ""));
                        url.Encode = Encoding.GetEncoding(XMLSettings.GetXmlNodeText(node, "Encode", ""));
                        url.LocalPath = XMLSettings.GetXmlNodeText(node, "LocalPath", "");
                        url.IndexFile = XMLSettings.GetXmlNodeText(node, "IndexFile", "");
                        urls.Add(url);
                    }
                    return urls.ToArray();
                }
                catch 
                {
                
                }
                return null;        }
            #endregion
            
            #region 保存任务列表
            /// <summary>
            /// 保存任务列表
            /// </summary>
            /// <param name="urls"></param>
            public static void SaveTask(URL [] urls)
            {
                string taskList = Tools.StartPath + "\\Settings\\Task.xml";
                try 
                {
                    File.Delete(taskList); 
                }
                catch { }
                XmlTextWriter xtw = new XmlTextWriter(taskList, Encoding.UTF8);
                xtw.WriteRaw("<?xml version=\"1.0\" encoding=\"utf-8\" ?>" );
                xtw.WriteRaw("\r\n");
                xtw.WriteStartElement("ShootSearch");
                xtw.WriteStartElement("Task");
                foreach(URL url in urls)
                {
                    xtw.WriteRaw("\r\n");                xtw.WriteRaw(XMLSettings.NewTag("Item", url.Url.ToString(),
                        "Encode", url.Encode.HeaderName,
                        "LocalPath", url.LocalPath,
                        "IndexFile", url.IndexFile));
                    //xtw.WriteElementString("Item", url.Url.ToString());
                    ////xtw.WriteAttributeString("Url", url.Url.ToString());
                    //xtw.WriteAttributeString("Encode", url.Encode.HeaderName);
                    //xtw.WriteAttributeString("LocalPath", url.LocalPath);
                    //xtw.WriteAttributeString("IndexFile", url.IndexFile);
                    xtw.WriteRaw("\r\n");
                }
                xtw.Close();
            }        #endregion        #region 将Content Type列表转换为哈希表,以方便搜索
            /// <summary>
            /// 将Content Type列表转换为哈希表,以方便搜索
            /// </summary>
            /// <param name="dt"></param>
            /// <returns></returns>
            public static Hashtable ConvertDataTable2Hashtable(DataTable dt)
            {
                Hashtable ht = new Hashtable();
                string str = "";
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    str = dt.Rows[i][1].ToString();
                    if (!ht.ContainsKey(str) && str != "*/*")
                    {
                        ht.Add(str, "");
                    }
                }
                return ht;
            } 
            #endregion    }
    }