从数据库中返回xml数据,主流的dbms都有api提供,如sqlserver的openxml,for xml,oracle的xmlquery等,也提供了xml数据格式控制的语法,具体可以参考api的语法说明
如果你的应用对xml格式的要求比较高,如要使用.net的xml序列化,那么可以使用xsl对数据库返回的xml数据做一部格式转换,就可以满足通用性的需求,当然数据大的话性能损失那是相当严重,因此dal的设计就要考虑了

解决方案 »

  1.   

    这里提供一个使用 System.Xml.XmlWriter 手动输出 XML Demo, XmlWriter/XmlReader 效率比较高,当然你还可以使用 XmlDocument, XmlPathNavigator 等等参考示例:// 输出XML
    void CreateProductCategoryXml3()
        {
            DataSet ds = CreateProductCategoryDataSet();
            DataTable dtPro = ds.Tables["Products"];
            DataTable dtCat = ds.Tables["Categories"];        string filePath = Server.MapPath(@"..\..\App_Data\ProductCategory3.Xml");
            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Indent = true;        using (XmlWriter writer = XmlWriter.Create(filePath, settings)) {
                writer.WriteStartElement(ds.DataSetName);            //writer.WriteStartElement(dtCat.TableName);
                foreach (DataRow catRow in dtCat.Rows) {
                    writer.WriteStartElement("Category");                writer.WriteStartAttribute(dtCat.Columns[0].ColumnName);
                    writer.WriteString(catRow[0].ToString());                writer.WriteStartAttribute(dtCat.Columns[1].ColumnName);
                    writer.WriteString(catRow[1].ToString());
                    writer.WriteEndAttribute();                //writer.WriteStartElement(dtPro.TableName);
                    foreach (DataRow proRow in catRow.GetChildRows(ds.Relations[0])) {
                        writer.WriteStartElement("Product");                    writer.WriteStartAttribute(dtPro.Columns[0].ColumnName);
                        writer.WriteString(proRow[0].ToString());                    writer.WriteStartAttribute(dtPro.Columns[1].ColumnName);
                        writer.WriteString(proRow[1].ToString());
                        writer.WriteEndAttribute();                    writer.WriteEndElement();
                    }
                    //writer.WriteEndElement();                writer.WriteEndElement();
                }
                //writer.WriteEndElement();            writer.WriteEndElement();
            }
        }// 提供测试数据
    public static DataSet CreateProductCategoryDataSet()
        {
            DataSet ds = new DataSet("ProductCategorySet");
            DataTable dtPro = CreateProductTable();
            DataTable dtCat = CreateCategoryTable();
            ds.Tables.Add(dtPro);
            ds.Tables.Add(dtCat);
            ds.Relations.Add(dtCat.Columns["CategoryID"], dtPro.Columns["CategoryID"]);
            
            return ds;
        }    public static DataTable CreateProductTable()
        {
            DataTable tbl = new DataTable("Products");        tbl.Columns.Add("ProductID", typeof(int));
            tbl.Columns.Add("ProductName", typeof(string));        
            tbl.Columns.Add("CategoryID", typeof(int));
            tbl.Columns.Add("DateCreated", typeof(DateTime));
            DataRow row = tbl.NewRow();
            row[0] = 1;
            row[1] = "Chai";
            row[2] = 1;
            row["DateCreated"] = new DateTime(1999, 3, 24);
            tbl.Rows.Add(row);        row = tbl.NewRow();
            row[0] = 2;
            row[1] = "Chang";
            row[2] = 1;
            row[3] = new DateTime(1999, 4, 2);
            tbl.Rows.Add(row);        row = tbl.NewRow();
            row[0] = 3;
            row[1] = "Aniseed Syrup";
            row[2] = 2;
            row[3] = new DateTime(1999, 3, 24);
            tbl.Rows.Add(row);        row = tbl.NewRow();
            row[0] = 4;
            row[1] = "Chef Anton's Cajun Seasoning";
            row[2] = 2;
            row[3] = new DateTime(2000, 12, 12);
            tbl.Rows.Add(row);        row = tbl.NewRow();
            row[0] = 5;
            row[1] = "Chef Anton's Gumbo Mix";
            row[2] = 2;
            row[3] = new DateTime(2000, 12, 25);
            tbl.Rows.Add(row);        row = tbl.NewRow();
            row[0] = 47;
            row[1] = "Zaanse koeken";
            row[2] = 3;
            row[3] = new DateTime(2001, 1, 2);
            tbl.Rows.Add(row);        row = tbl.NewRow();
            row[0] = 48;
            row[1] = "Chocolade";
            row[2] = 3;
            row[3] = new DateTime(2001, 1, 12);
            tbl.Rows.Add(row);        row = tbl.NewRow();
            row[0] = 49;
            row[1] = "Maxilaku";
            row[2] = 3;
            row[3] = new DateTime(2001, 8, 12);
            tbl.Rows.Add(row);        return tbl;
        }    public static DataTable CreateCategoryTable()
        {
            DataTable tbl = new DataTable("Categories");        tbl.Columns.Add("CategoryID", typeof(int));
            tbl.Columns.Add("CategoryName", typeof(string));        
            DataRow row = tbl.NewRow();
            row[0] = 1;
            row[1] = "Beverages";
            tbl.Rows.Add(row);        row = tbl.NewRow();
            row[0] = 2;
            row[1] = "Condiments";        
            tbl.Rows.Add(row);        row = tbl.NewRow();
            row[0] = 3;
            row[1] = "Confections";
            tbl.Rows.Add(row);        return tbl;
        }4. 
    结果示例<?xml version="1.0" encoding="utf-8"?>
    <ProductCategorySet>
      <Category CategoryID="1" CategoryName="Beverages">
        <Product ProductID="1" ProductName="Chai" />
        <Product ProductID="2" ProductName="Chang" />
      </Category>
      <Category CategoryID="2" CategoryName="Condiments">
        <Product ProductID="3" ProductName="Aniseed Syrup" />
        <Product ProductID="4" ProductName="Chef Anton's Cajun Seasoning" />
        <Product ProductID="5" ProductName="Chef Anton's Gumbo Mix" />
      </Category>
      <Category CategoryID="3" CategoryName="Confections">
        <Product ProductID="47" ProductName="Zaanse koeken" />
        <Product ProductID="48" ProductName="Chocolade" />
        <Product ProductID="49" ProductName="Maxilaku" />
      </Category>
    </ProductCategorySet>
    Good Luck1