【问题标题】:how to convert Database Hierarchical Data to XML using ASP.net 3.5 and LINQ如何使用 ASP.net 3.5 和 LINQ 将数据库分层数据转换为 XML
【发布时间】:2010-05-13 06:25:55
【问题描述】:

我有一个层次结构的表。像这样:

(来源:aspalliance.com

此处显示的表格数据:

(来源:aspalliance.com


这种策略使我能够拥有无限的类别和子类别。

我使用 ASP.net 3.5 SP1 和 LINQ 和 MSSQL Server2005。 如何将其转换为 XML? 我可以使用 Dataset Object 和“.GetXML()”方法来实现。但是如何用 LINQtoSQL 或 LINQtoXML 实现它???或者是否有另一种更简单的方法来执行此操作?你的建议是什么?最好的办法?我在网上搜索但没有找到 .net 3.5 的功能。

问题更新
感谢 Murph,但现在我有一个新问题。我想在我的项目中制作一个 Dunamic SiteMap 文件。您知道 ASP.net 中的 SiteMap 文件如下所示:

<siteMapNode url="~/Category?cid=0" title="Home"  description="Home">

    <siteMapNode url="~/Category?cid=1" title="a"  description="" />

    <siteMapNode url="~/Category?cid=2" title="b"  description="" >

        <siteMapNode url="~/Category?cid=3" title="c"  description="" />

        <siteMapNode url="~/Category?cid=4" title="d"  description="" />

    </siteMapNode>
</siteMapNode>

主要问题是根据 Mr.Murph 的代码,子类别将嵌套在元素中。但在 SiteMap 案例中,我们没有这样的元素,所有类别和子类别都嵌套在元素中。如何更改 Mr.Murph 代码以塑造此架构?

【问题讨论】:

  • 我也想知道这个问题的答案。

标签: c# asp.net linq linq-to-sql hierarchical-data


【解决方案1】:

很快就可以了(并且完全未经测试)。

使用 Linq to SQL 和 Linq to XML(它们是通用的 .NET 而不是 ASP.NET 特定的)“滚动你自己的”XML 相当简单,考虑到我将在之后详细说明的一些假设(现在按照建议稍作修改):

void Main()
{
    DataContext dc = new DataContext();

    menuXML = new XDocument();
    XElement root = new XElement("menuxml",
        from m in dc.Menus
        where m.ParentID == null
        select GetMenuXML(m));

    menuXML.Add(root);
    // You've now got an XML document that you can do with as you need
    // For test you can save...
    menuXML.Save("filename.xml");
}

private static XElement GetMenuXML(Menu menu) 
{ 
    return new XElement("category",  
        new XAttribute("MenuID", menu.MenuID), 
        new XAttribute("Text", menu.Text), 
        new XElement("Description", menu.Description), 
        new XElement("menus", menu.Menus.Select(m => GetMenuXML(m)))); 
}

好的,从顶部开始

  • 我假设有一个名为 DataContext 的 Linq to SQL 数据上下文,其中您已将表映射到 Menus,并且父/子关系在父端是 ChildMenus。
  • 我们创建一个新文档
  • 我们创建一个新元素,将其用作我们将调用 menuxml 的根
  • 然后,我们执行 linq to SQL 查询以选择所有没有父项的菜单条目,并调用 GetMenuXML 为这些条目的单个菜单记录(即该记录及其子记录)输出 XML。李>
  • GetMenuXML 输出一个菜单条目,拆分属性和元素之间的唯一一点不同的是,我使用了一个 Lamba 表达式而不是详细的语法来生成子菜单 - 但如果我做对了(记住没有测试!)那是在做一些事情

from m in menu.ChildMenus select GetMenuXML(m)

如果它有效(!)你应该得到类似的 XML

<menuxml>
    <menu MenuID="1" Text="Product">
        <Description>A list of products</Description>
        <menus>
            <menu MenuID="6" Text="Background">
                <Description>Product Background</Description>
                <menus>
                    <menu MenuID="18" Text="Internet Restriction">
                        <Description>Internet Restriction</Description>
                        <!-- children if any would be here -->
                    </menu>
                    <menu MenuID="19" Text="Speed Solution">
                        <Description>Speed Solutions</Description>
                    </menu>
                </menus>
            </menu>
            <menu MenuID="7" Text="Background">
                <Description>Product Details</Description>
            </menu>
        </menus>
    </menu>
    <!-- rest of the top level menus -->
</menuxml>

【讨论】:

  • 非常感谢您的详细回答。我会测试你的想法并说出结果。
  • 嗨,墨菲先生!我现在正在测试你的代码。这是一些问题。首先,你能描述一下 GetMenuXML() 中的 menu.ChildMenus 是什么吗?这是与菜单表相关的第二个表吗?但我只有一个自联接表!
  • 请在您的答案下方阅读我的答案并编辑您的代码以供他人使用。
  • 好的。 ChildMenus 是自加入的父/子关系 - 您是对的,默认值将是您的代码中的 Menus,我会更改它。
  • 嗨,墨菲先生!现在我在将表转换为 XML 文件时遇到问题。我不熟悉 LINQtoXML,你能再帮我一次吗?我想转换您的递归代码以生成带有 元素的 SiteMap XML 文件。在这种情况下,没有 元素,我们嵌套了 我无法解决这个问题。我更新了上面的问题,请阅读!
【解决方案2】:

谢谢你亲爱的墨菲。我用了你的代码,效果很好。但正如你所说,你没有测试你的代码,所以GetMenuXML() 有一些错误。这是更正:

private static XElement GetMenuXML(Menu menu)
{
    return new XElement("category", 
        new XAttribute("MenuID", menu.MenuID),
        new XAttribute("Text", menu.Text),
        new XElement("Description", menu.Description),
        new XElement("menus", menu.Menus.Select(m => GetMenuXML(m))));
} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-04
    • 2020-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-22
    • 1970-01-01
    相关资源
    最近更新 更多