PDA

View Full Version : آموزش:*ساخت فایل XML از روی SQL برای استفاده در asp:menu*



maxpayn2
دوشنبه 10 دی 1386, 13:38 عصر
سلام
چند وقت بود که برام سوال شده بود چه طوری میشه فایل Web.sitemap که یه فایل XML هست رو به صورت اتوماتیک و از روی دیتابیس ساخت تا بشه به کمک اون منو ها و زیر منو ها به صورت داینامیک و بوسیله خود کاربر ساخته بشن ، بعد از جستجو به نتایجی رسیدم که حاصل اون ها رو اینجا مینویسم :

SQL :

http://i8.tinypic.com/8fyvpyw.jpg

ASPX :




<asp:MenuID="Menu1"runat="server"DataSourceID="SiteMapDataSource1">


</asp:Menu>


<asp:SiteMapDataSourceID="SiteMapDataSource1"runat="server"ShowStartingNode="false"/>







C# :






using System;
using System.IO;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;using System.Xml;
using System.Xml.Serialization;

public partialclassXMLmenu : System.Web.UI.Page
{
protectedvoid Page_Load(object sender, EventArgs e)


{


string path = Server.MapPath("~") + "\\Web.sitemap";

Label1.Text = path;

XmlTextWriter xtw = newXmlTextWriter(path, System.Text.UTF8Encoding.UTF8);
xtw.WriteStartDocument();
xtw.Formatting = Formatting.Indented;
xtw.WriteStartElement("siteMap", "http://schemas.microsoft.com/AspNet/SiteMap-File-1.0");
xtw.WriteStartElement("siteMapNode");
xtw.WriteAttributeString("url", "");
xtw.WriteAttributeString("title", "");
xtw.WriteAttributeString("description", "");
SqlConnection cnn = newSqlConnection("Data Source=.;Database=test;Integrated Security=SSPI");
SqlCommand cmd = newSqlCommand();
cmd.Connection = cnn;
cmd.CommandText = "select * from menu where parent_id = '0'";
cnn.Open();
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
xtw.WriteStartElement("siteMapNode");
xtw.WriteAttributeString("url", dr[2].ToString());
xtw.WriteAttributeString("title", dr[3].ToString());
xtw.WriteAttributeString("description", "");
SqlConnection cnn1 = newSqlConnection("Data Source=.;Database=test;Integrated Security=SSPI");
SqlCommand cmd1 = newSqlCommand();
cmd1.Connection = cnn1;
cmd1.CommandText = "select * from menu where parent_id = '" + Convert.ToInt32(dr[0].ToString()) + "'";
cnn1.Open();
SqlDataReader dr1 = cmd1.ExecuteReader();
while (dr1.Read())
{
xtw.WriteStartElement("siteMapNode");
xtw.WriteAttributeString("url", dr1[2].ToString());
xtw.WriteAttributeString("title", dr1[3].ToString());
xtw.WriteAttributeString("description", "");
SqlConnection cnn2 = newSqlConnection("Data Source=.;Database=test;Integrated Security=SSPI");
SqlCommand cmd2 = newSqlCommand();
cmd2.Connection = cnn2;
cmd2.CommandText = "select * from menu where parent_id = '" + Convert.ToInt32(dr1[0].ToString()) + "'";
cnn2.Open();
SqlDataReader dr2 = cmd2.ExecuteReader();
while (dr2.Read())
{
xtw.WriteStartElement("siteMapNode");
xtw.WriteAttributeString("url", dr2[2].ToString());
xtw.WriteAttributeString("title", dr2[3].ToString());
xtw.WriteAttributeString("description", "");
xtw.WriteEndElement();
}
cnn2.Close();
xtw.WriteEndElement();
}
cnn1.Close();
xtw.WriteEndElement();
}
cnn.Close();
xtw.WriteEndElement();

xtw.Close();
}
}






VB (با استفاده از سایت های کانورتر تبدیل کردم) :






Imports System
Imports System.IO
Imports System.Data

Imports System.Data.SqlClient

Imports System.Configuration
Imports System.Collections
Imports System.Web
Imports System.Web.Security
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Web.UI.WebControls.WebParts
Imports System.Web.UI.HtmlControls
Imports System.Xml
Imports System.Xml.Serialization
Public Class XMLmenu Inherits System.Web.UI.Page

Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)



Dim path As String = (Server.MapPath("~") + "\\Web.sitemap")


Label1.Text = path

Dim xtw As XmlTextWriter = New XmlTextWriter(path, System.Text.UTF8Encoding.UTF8)

xtw.WriteStartDocument
xtw.Formatting = Formatting.Indented
xtw.WriteStartElement("siteMap", "http://schemas.microsoft.com/AspNet/SiteMap-File-1.0")
xtw.WriteStartElement("siteMapNode")
xtw.WriteAttributeString("url", "")
xtw.WriteAttributeString("title", "")
xtw.WriteAttributeString("description", "")
Dim cnn As SqlConnection = New SqlConnection("Data Source=.;Database=test;Integrated Security=SSPI")
Dim cmd As SqlCommand = New SqlCommand
cmd.Connection = cnn
cmd.CommandText = "select * from menu where parent_id = '0'"
cnn.Open

Dim dr As SqlDataReader = cmd.ExecuteReader

While dr.Read



xtw.WriteStartElement("siteMapNode")


xtw.WriteAttributeString("url", dr(2).ToString)

xtw.WriteAttributeString("title", dr(3).ToString)

xtw.WriteAttributeString("description", "")
Dim cnn1 As SqlConnection = New SqlConnection("Data Source=.;Database=test;Integrated Security=SSPI")
Dim cmd1 As SqlCommand = New SqlCommand
cmd1.Connection = cnn1
cmd1.CommandText = ("select * from menu where parent_id = '" _
+ (Convert.ToInt32(dr(0).ToString) + "'"))
cnn1.Open

Dim dr1 As SqlDataReader = cmd1.ExecuteReader

While dr1.Read



xtw.WriteStartElement("siteMapNode")


xtw.WriteAttributeString("url", dr1(2).ToString)

xtw.WriteAttributeString("title", dr1(3).ToString)

xtw.WriteAttributeString("description", "")
Dim cnn2 As SqlConnection = New SqlConnection("Data Source=.;Database=test;Integrated Security=SSPI")
Dim cmd2 As SqlCommand = New SqlCommand
cmd2.Connection = cnn2
cmd2.CommandText = ("select * from menu where parent_id = '" _
+ (Convert.ToInt32(dr1(0).ToString) + "'"))
cnn2.Open

Dim dr2 As SqlDataReader = cmd2.ExecuteReader

While dr2.Read



xtw.WriteStartElement("siteMapNode")


xtw.WriteAttributeString("url", dr2(2).ToString)

xtw.WriteAttributeString("title", dr2(3).ToString)

xtw.WriteAttributeString("description", "")

xtw.WriteEndElement

End While



cnn2.Close


xtw.WriteEndElement

End While


cnn1.Close


xtw.WriteEndElement

End While


cnn.Close


xtw.WriteEndElement

xtw.Close

End Sub
End Class







البته طریقه کد نویسیش بسیار ابتدایی و غیر حرفه ای ، دوستان به حرفه ای بودن خودشون ببخشن ، اگه هم کسی لطف کرد و طریقه کدنویسی رو برای خودش بهبود بخشید اینجا هم بزاره

raravaice
دوشنبه 10 دی 1386, 14:21 عصر
سلام
به جای datareader از dataset استفاده کن
مقادیرت رو بریز توی یه متغییر از نوع dataset ، این متغییر خودش یه قابلیت savexml داره.

نام ستونهای بانکت هم یا همنام با پارامترهای web.sitemap کن یا هنگام خوندن تغییرشون بده.
مثلا
select menu_address as url from menu
موفق باشی

maxpayn2
دوشنبه 10 دی 1386, 20:05 عصر
با تشکر از جناب raravaice کسی میدونه چه طوری میشه یه کاری کرد که دیگه محدودیت parent نداشته باشیم ؟ این کد سه مرحله جلو میره ولی اگه بشه بی نهایتش کرد خیلی بهتره .

maxpayn2
سه شنبه 11 دی 1386, 11:43 صبح
کسی از دوستان در باره بی نهایت کردن زیر گروه ها نظری نداره ؟

raravaice
سه شنبه 11 دی 1386, 12:18 عصر
سلام
MAXPAYN2 عزیز

من تعجب میکنم که چرا از dataset استفاده نمی کنی.به جای اینکه چندین با بانکت رو بخونی 1 با بخون کل دیتاشو بریز توی dataset حالا بانکت هر چندتا رکور که داشته باشه تو dataset هست بعد dataset رو بزار توی FOR 0 تا تعداد سطر های دیتاست -1 اطلاعاتت رو از توش در بیار
حتی تا بینهایت ("البته اگر SQL از این عدد پشتیبانی کنه"):چشمک:

maxpayn2
سه شنبه 11 دی 1386, 12:41 عصر
طریقه کد نویسیش بسیار ابتدایی و غیر حرفه ای ، دوستان به حرفه ای بودن خودشون ببخشن ، اگه هم کسی لطف کرد و طریقه کدنویسی رو برای خودش بهبود بخشید اینجا هم بزاره


اگه میشه نمونه کد رو اینجا بزارین بسیار ممنون میشم

raravaice
سه شنبه 11 دی 1386, 12:50 عصر
Dim con As SqlConnection
Dim dastoor As String
Dim da As SqlDataAdapter
Dim ds As New DataSet
dim i as integer


con = New SqlConnection(strcon)
dastoor = "SELECT menu_address as url,menu_text as title from menu "
da = New SqlDataAdapter(dastoor, con)
ds = New DataSet
con.Open()
da.Fill(ds, "menu")
con.Close()


for i = 0 to ds.Tables(0).Rows.Count - 1

xtw.WriteStartElement("siteMapNode")

xtw.WriteAttributeString("url", ds.Tables(0).Rows(I).Item("url"))

xtw.WriteAttributeString("title", ds.Tables(0).Rows(I).Item("title"))

xtw.WriteAttributeString("description", "")

next

maxpayn2
سه شنبه 11 دی 1386, 14:02 عصر
خیلی ممنون ولی این کد هم هنوز زیر گروه های بینهایت رو support نمیکنه

mahdi_farhani
سه شنبه 11 دی 1386, 14:13 عصر
اینم کلاسی که بتونید به صورت نامحدود زیر منو بسازید.
توضیحات زیادی هم نیازی نیست.
فقط اینو بگم که فایل اسکریپت SQL رو اجرا کنید
بعد اگر کانکشن استرینگتون مشکل داشت دیگه خودتون تنظیم کنید.
در ضمن از Dataset.XSD برای اتصال به بانک استفاده شده .
****************************************
اشکالات احتمالی :

1-تابع ، سازنده فایل چون داخل PageLoad احتمال اینکه دو تا کاربر همزمان وارد سایت شده و دستور ساخت اجرا شود وجود دارد و به احتمال قوی با مشکل مواجه میشه.
2-اگر احتیاج به سطح دسترسی دارید از این تابع نمیتونید استفاده کنید.
************************************************
راه حل پیشنهادی
برای هر یوزر یک پوشه ساخته شود و فایل در آن قرار گیرد ،که هردو مشکل فوق حل میشه.
در این کلاس این امکان گذاشته شده ، بسته به نیاز خود میتونید ازش استفاده کنید
----------------------------------------------------------------
با رعایت حق کپی رایت اجازه تغییر دارید ، هرگونه تغییر را لطفاً اعلام کنید.

raravaice
سه شنبه 11 دی 1386, 14:20 عصر
سلام

راستی کریسمس مبارک

من منظورت رو از زیر گروه بینهایت نمی فهمم.

mahdi_farhani
سه شنبه 11 دی 1386, 14:23 عصر
زیر منوی بی نهایت یه چیز تو این مایه ها میشه


|Menu-1
|--------SubMenu
|--------SubMenu
|----------------SubMenu
|------------------------SubMenu
|------------------------SubMenu
|-------------------------------------------------.........
|----------------SubMenu
|--------SubMenu
|Menu-2
|--------SubMenu
|------------------SubMenu
|------------------------SubMenu
|---------------------------------SubMenu
|-------------------------------------------SubMenu
|------------------------------------------------SubMenu
|-----------------------------------------------------------.........
|----------------SubMenu
|--------SubMenu

maxpayn2
یک شنبه 28 بهمن 1386, 19:42 عصر
دمه اون برنامه نویسی که این کد رو نوشته گرم :

http://aspalliance.com/822 (http://aspalliance.com/822)