2010-05-13 3 views
3

J'ai une table avec une structure hiérarchique. comme ceci:
alt text http://aspalliance.com/ArticleFiles/822/image002.gifcomment convertir des données hiérarchiques de base de données en XML en utilisant ASP.net 3.5 et LINQ

et les données présentées ici: tableau
alt text http://aspalliance.com/ArticleFiles/822/image003.gif
cette stratégie me donne la possibilité d'avoir des catégories sans entrave et sous-catégories. J'utilise ASP.net 3.5 SP1 et LINQ et MSSQL Server2005

Comment le convertir en XML? Je peux le faire avec Dataset Object et ".GetXML()" méthode. mais comment l'implémenter avec LINQtoSQL ou LINQtoXML ??? ou s'il y a une autre façon plus simple d'effectuer cela? quelle est votre suggestion? la meilleure façon? J'ai cherché sur le web mais je n'ai rien trouvé pour .net 3.5 featuers.

Question Mise à jour
thnks à Murph mais maintenant j'ai un nouveau problème. Je veux créer un fichier SiteMap Dunamic dans mon projet. Vous savez que le fichier SiteMap dans ASP.net ressemble à ceci:

<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> 

principal problème est que selon le code de Mr.Murph les sous-catégories seront imbriquées dans l'élément. mais dans SiteMap Case nous n'avons aucun de ces éléments et toutes les catégories et sous-catégories sont imbriquées dans des éléments. comment puis-je changer le code de MrMurph pour donner forme à ce schéma?

+0

Je voudrais aussi connaître la réponse à cette question. – IsmailS

Répondre

2

Ok très rapidement (et complètement non testé). Pour «rouler le vôtre» XML en utilisant Linq to SQL et Linq to XML (qui sont génériques .NET et non spécifiques à ASP.NET) est assez simple, cela devrait être suffisant étant donné quelques hypothèses que je détaillerai après (maintenant légèrement modifié comme suggéré):

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)))); 
} 

Ok, du haut

  • Je suppose un Linq au contexte de données SQL appelé DataContext dans lequel vous avez la table mise en correspondance des menus et la relation parent/enfant est ChildMenus à la fin parente.
  • Nous créons un nouveau document
  • Nous créons un nouvel élément que nous allons utiliser la racine que nous appellerons menuxml
  • Nous alors une requête LINQ to SQL pour sélectionner toutes les entrées de menu qui n » t avoir un parent et appeler GetMenuXML pour sortir le XML pour un seul enregistrement de menu (c'est-à-dire cet enregistrement et ses enfants) pour ces entrées. GetMenuXML génère un seul élément de menu partagé entre les attributs et les éléments. La seule chose légèrement différente est que j'ai utilisé une expression lamba au lieu de la syntaxe verbeuse pour générer les menus enfants - mais si j'ai bien compris essai!) des thats faire quelque chose le long des lignes de

from m in menu.ChildMenus select GetMenuXML(m)

Si cela fonctionne (!) vous devriez obtenir XML quelque chose comme

<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> 
+0

je vous remercie beaucoup pour votre réponse détaillée. Je vais tester votre idée et dire le résultat. – mahdiahmadirad

+0

bonjour M. Murph! Je teste votre code maintenant. c'est quelques problèmes. Tout d'abord, pouvez-vous me décrire ce qu'est menu.ChildMenus dans GetMenuXML() ?? est-ce une deuxième table liée à la table de menu? mais j'ai seulement une table de jointure automatique! – mahdiahmadirad

+0

s'il vous plaît jeter un oeil à cet article: http://aspalliance.com/822 – mahdiahmadirad

2

merci cher Murph. J'ai utilisé votre code et ça a bien marché. mais comme vous le dites, vous n'avez pas testé votre code alors GetMenuXML() a eu quelques erreurs. voici la correction:

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)))); 
} 
Questions connexes