Jag håller på med en fråga som jag använder FOR XML i och kan inte få till det. Det jag försöker göra är en navigering. Jag lägger in länkarna i en databas, sen hämtar jag dom och gör en xml-fil av det eller så använder jag xsl, det har jag inte bestämt ännu. Det har ju ingen betydelse heller. Min tabell ser ut så här: Inte 100% säker men jag tror att detta funkar: Hej Samuel Det här borde ge det resultat du vill ha: Det här borde ge exakt det du vill ha (men kanske finns bättre sätt?): Det är riktigt när nu:) Jättetack för du tar dej tid:) Så här ser databasen ut (har bara lagt in en massastrunt) Detta ser ut att fungera:) Efter mycket letande på nätet och testande har jag lyckats lösa det, men på ett annat sätt. Nu sparas det inte i en xml-fil, men det får jag leva med.SQLfråga med FOR XML
menuID
parentID
menuText
menuToolTip
menuPath
Det jag vill ha ut är följande:
<code>
<menu>
<menuItem text="HEM" description="Till förstsidan" path="~/default.aspx">
<menuItem text="xxx" description="xxx" path="xxx" />
<menuItem text="yyy" description="yyy" path="yyy" />
</menuItem>
<menuItem text="Kontakt" description="Kontakta oss" path="~/contact.aspx" />
<menuItem text="Om sidan" description="Info om sidan" path="~/aboutPage.aspx" />
<menuItem text="Portfölj" description="Se saker vi gjort" path="~/portfolio.xml">
<menuItem text="Chatt" description="En chatt" path="chatt.aspx" />
<menuItem text="Forum" description="Ett forum" path="forum.aspx" />
</menuItem>
</menu>
</code>
Jaghar denna SP:
<code>
ALTER PROC doXml
as
select
1 as tag ,
null as parent ,
[text] as [menuItem!1!text] ,
description as [menuItem!1!description] ,
menuPath as [menuItem!1!path],
null as [menuItem!2!text] ,
null as [menuItem!2!description],
null as [menuItem!2!path]
from menuDB
where parentid = -1
union all
select
m ,
m ,
m1.[text] ,
m1.description ,
m1.menuPath,
m2.[text] ,
m2.description,
m2.menuPath
from menuDB m1 , menuDB m2
where m2.parentid = m1.menuID
for xml explicit
</code>
den genererar detta:
<code>
<menu>
<menuItem text="HEM" description="Till förstsidan" path="~/default.aspx" />
<menuItem text="Kontakt" description="Kontakta oss" path="~/contact.aspx" />
<menuItem text="Om sidan" description="Info om sidan" path="~/aboutPage.aspx" />
<menuItem text="Portfölj" description="Se saker vi gjort" path="~/portfolio.xml">
<menuItem text="Chatt" description="En chatt" path="chatt.aspx" />
<menuItem text="Forum" description="Ett forum" path="forum.aspx" />
<menuItem text="xxx" description="xxx" path="xxx" />
<menuItem text="yyy" description="yyy" path="yyy" />
</menuItem>
</menu>
</code>
Nu läggs alltså alla undernoder till den sista noden. Jag kommer inte vidare med denna och hoppas nån kan hjälpa mej på traven.Sv: SQLfråga med FOR XML
...
union all
select
2, -- m
1, -- m
m1.[text] ,
m1.description ,
...Sv:SQLfråga med FOR XML
Det måste ha hänt nåt när jag kopierade in det eller så fipplade jag med nåt. Det är så jag har koden.
<code>
ALTER PROC doXml
as
select
1 as tag ,
null as parent ,
[text] as [menuItem!1!text] ,
description as [menuItem!1!description] ,
menuPath as [menuItem!1!path],
null as [menuItem!2!text] ,
null as [menuItem!2!description],
null as [menuItem!2!path]
from menuDB
where parentid = -1
union all
select
2 ,
1 ,
m1.[text] ,
m1.description ,
m1.menuPath,
m2.[text] ,
m2.description,
m2.menuPath
from menuDB m1 , menuDB m2
where m2.parentid = m1.menuID
for xml explicit
</code>Sv: SQLfråga med FOR XML
select
m1.[text] ,
m1.description,
m1.menuPath,
m2.[text] ,
m2.description,
m2.menuPath
from menuDB m1 , menuDB m2
where m2.parentid = m1.menuID
for xml AUTO
Jag tror dock att det blir utan <menu> och </menu>.Sv:SQLfråga med FOR XML
SELECT 1 as Tag,
NULL as Parent,
NULL as [menu!1!menu],
NULL as [menuitem!2!text],
NULL as [menuitem!2!description],
NULL as [menuitem!2!path],
NULL as [menuitem!3!text],
NULL as [menuitem!3!description],
NULL as [menuitem!3!path]
UNION ALL
SELECT 2 as Tag,
1 as Parent,
null,
m.text,
m.description,
m.path,
NULL,
NULL,
NULL
FROM menuDB m
WHERE m.parentid = -1
UNION ALL
SELECT 3 as Tag,
2 as Parent,
NULL,
m1.text, -- kan nog ha null här ..
m1.description, -- kan nog ha null här ..
m1.path, -- kan nog ha null här ..
m2.text,
m2.description,
m2.path
FROM menuDB m1, menuDB m2
WHERE m1.parentid = -1
AND m2.parentid = m1.menucategoryid
order BY [menu!1!menu], [menuitem!2!text]
FOR XML EXPLICIT
phew :)Sv: SQLfråga med FOR XML
34 Hem Till förstasidan -1 ~/default.aspx
42 Meny Hantera menyn -1 ~/addMenu.aspx
43 Redigera menyn Redigera menyn 42 test
44 Podcasts Här hittar du mina podcasts -1 pods
45 Lab poden Min labpod 44 port
46 Musik podden musik 44 sdsd
47 12 456 34 12
48 Hem2 Hantera menyn 42 asdas
49 Karate Här hanterar du menyn 42 asfaf
50 Lab poden Hantera menyn 42 ih hioho
51 gh dfsgsd 42 asfaf
Som du ser blir det lite tokigt, jag ser inget mönster när det blir fel heller.
<menu>
<menuitem text="Hem" description="Till förstasidan" menuPath="~/default.aspx">
<menuitem text="12" description="456" menuPath="12" />
<menuitem text="Hem2" description="Hantera menyn" menuPath="asdas" />
<menuitem text="Karate" description="Här hanterar du menyn" menuPath="asfaf" />
<menuitem text="Lab poden" description="Hantera menyn" menuPath="ih hioho" />
<menuitem text="gh" description="dfsgsd" menuPath="asfaf" />
</menuitem>
<menuitem text="Meny" description="Hantera menyn" menuPath="~/addMenu.aspx">
<menuitem text="Redigera menyn" description="Redigera menyn" menuPath="test" />
<menuitem text="Lab poden" description="Min labpod" menuPath="port" />
<menuitem text="Musik podden" description="musik" menuPath="sdsd" />
</menuitem>
<menuitem text="Podcasts" description="Här hittar du mina podcasts" menuPath="pods" />
</menu>Sv:SQLfråga med FOR XML
<code>
ALTER PROC doXml
as
select
m1.[text] ,
m1.description,
m1.menuPath,
m2.[text] ,
m2.description,
m2.menuPath
from menuDB m1 , menuDB m2
where m2.parentid = m1.menuID
for xml AUTO
</code>
Problemet är bara att jag ser bara m1 och m2 på sidan, jag ser alltså inte texten.Har försökt ändra det men får inte till det. Såhär har jag bundit kontrollen. Detta är nu efter det gamla försöket. Men då kunde jag ju döpa alla taggar till "menuItem",det kanjag ju inte nu, eller?
<asp:Menu ID="menu" Orientation="Horizontal" DataSourceID="XmlDataSource1" runat="server"
DynamicHorizontalOffset="2" StaticSubMenuIndent="10px" StaticDisplayLevels="2" >
<DataBindings>
<asp:MenuItemBinding DataMember="menuItem" NavigateUrlField="menuPath"
TextField="text" ToolTipField="description"/>
</DataBindings>
<asp:XmlDataSource ID="XmlDataSource1" XPath="menu" runat="server" DataFile="~/XML/menu.xml" />Sv: SQLfråga med FOR XML
Ett annat problem som dök upp är att jag inte kan få det att fungera när jag gör databasanrop och det i min databasklass, troligen jag som returnerar fel eller nåt. Kan nån visa hur jag ska göra det?
<code>
<asp:Menu ID="menu" Orientation="Horizontal" DataSourceID="XmlDataSource1" runat="server"
DynamicHorizontalOffset="2" StaticSubMenuIndent="10px" StaticDisplayLevels="1" >
<DataBindings>
<asp:MenuItemBinding DataMember="MenuItem" NavigateUrlField="NavigateUrl"
TextField="Text" ToolTipField="ToolTip"/>
</DataBindings>
<StaticMenuItemStyle HorizontalPadding="5px" VerticalPadding="2px" />
<DynamicMenuItemStyle HorizontalPadding="5px" VerticalPadding="2px" />
</asp:Menu>
<asp:XmlDataSource ID="XmlDataSource1" TransformFile="~/TransformXSLT.xsl"
XPath="MenuItems/MenuItem" runat="server"/>
SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);
DataSet ds = new DataSet();
using (conn)
{
string sql = "Select MenuID, Text, Description, ParentID, menuPath from MenuDB";
SqlDataAdapter da = new SqlDataAdapter(sql, conn);
da.Fill(ds);
da.Dispose();
}
ds.DataSetName = "Menus";
ds.Tables[0].TableName = "Menu";
DataRelation relation = new DataRelation("ParentChild",
ds.Tables["Menu"].Columns["MenuID"],
ds.Tables["Menu"].Columns["ParentID"], false);
relation.Nested = true;
ds.Relations.Add(relation);
XmlDataSource1.Data = ds.GetXml();
XmlDataSource1.EnableCaching = false;
XmlDataSource1.DataBind();
<xsl:template match="/Menus">
<MenuItems>
<xsl:call-template name="MenuListing" />
</MenuItems>
</xsl:template>
<xsl:template name="MenuListing">
<xsl:apply-templates select="Menu" />
</xsl:template>
<xsl:template match="Menu">
<MenuItem>
<xsl:attribute name="Text">
<xsl:value-of select="Text"/>
</xsl:attribute>
<xsl:attribute name="ToolTip">
<xsl:value-of select="Description"/>
</xsl:attribute>
<xsl:attribute name="NavigateUrl">
<xsl:value-of select="menuPath"/>
</xsl:attribute>
<xsl:if test="count(Menu) > 0">
<xsl:call-template name="MenuListing" />
</xsl:if>
</MenuItem>
</xsl:template>
</code>