Хорошо, очень быстро (и полностью не проверено).
Чтобы «свернуть свой» XML с использованием Linq to SQL и Linq to XML (которые являются общими .NET, а не ASP.NET) довольно просто, этого должно быть достаточно, учитывая несколько предположений, которые я подробно опишу после (сейчас немного изменен как предложено):
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))));
}
Хорошо, сверху
- Я предполагаю, что контекст данных Linq to SQL называется DataContext, в котором у вас есть таблица, сопоставленная с Меню, и что отношение родитель / потомок - ChildMenus на родительском конце.
- Создаем новый документ
- Мы создаем новый элемент, который будем использовать в качестве корневого, который мы будем называть menuxml
- Затем мы выполняем запрос linq to SQL, чтобы выбрать все пункты меню, у которых нет родителя, и вызываем GetMenuXML, чтобы вывести XML для одной записи меню (то есть для этой записи и ее дочерних элементов) для этих записей.
- GetMenuXML выводит одну запись меню, разделенную между атрибутами и элементами, единственное, что немного отличается, это то, что я использовал лямбовское выражение вместо подробного синтаксиса для генерации дочерних меню - но если я понял это правильно (не помню, чтобы тест!) это делает что-то вроде
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>