Dérivation d'un fichier sitemap (de type xml) [Résolu]

Signaler
Messages postés
158
Date d'inscription
samedi 22 juin 2002
Statut
Membre
Dernière intervention
27 juin 2015
-
Messages postés
148
Date d'inscription
vendredi 28 avril 2006
Statut
Membre
Dernière intervention
1 décembre 2009
-
Bonjour.

Je souhaiterais savoir s'il est possible de dériver un fichier de type web.sitemap

Je m'explique, je souhaiterais rajouter un autre attribut qui soit autre que url, description ou title, afin de pouvoir stocker des informations pour chaque lien stocké...

Est ce que quelqu'un saurait m'indiquer comment faire ?
(sachant que peut être la dérivation n'est pas la meilleure solution hein...)

****************************************************
Il n'y a pas de pb sans solutions : il faut juste trouver le temps pour les chercher

12 réponses

Messages postés
148
Date d'inscription
vendredi 28 avril 2006
Statut
Membre
Dernière intervention
1 décembre 2009

En fait dans le web.sitemap tu peut ajouter n'importe qu'elle l'attribut.
Pour reprendre ton besoin, tu peut rajouter par exemple un attribut ImageURL au niveau des noeuds de ton web.sitemap que tu pourra recupèrer lors du chargement de ton Menu.

Ton web.sitemap aura l'air de ça ;
<?xmlversion="1.0"encoding="utf-8"?>
<siteMapxmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
<siteMapNodetitle="Home"url="Default.aspx"ImageUrl="~/folder.gif"estActiver ="false">
<siteMapNodetitle="Curriculum vitae"url="Resume.aspx"ImageUrl="~/folder.gif"estActiver ="false"/>
....

et lors du chargement tu doit ajouter ce petit bout de code sur l'évènement MenuItemDataBoud du Menu :



protected
void menua_MenuItemDataBound(
object sender,
MenuEventArgs e)
{
         e.Item.ImageUrl = (e.Item.DataItem
as
SiteMapNode)[
"ImageUrl"];
         e.Item.Enabled =
Convert.ToBoolean ((e.Item.DataItem
as
SiteMapNode)[
"estActiver"]);
}
Messages postés
148
Date d'inscription
vendredi 28 avril 2006
Statut
Membre
Dernière intervention
1 décembre 2009

Essaye de lui définir un nouveau shéma XSD pour ajouter les attributs que tu souhaiterais rajouter.
Commence à partir du shéma XSD par défaut d'un fichier Web.SiteMap qui se trouve a ce niveau C:\Program Files\Microsoft Visual Studio 8\xml\Schemas\SiteMapSchema.xsd.
Messages postés
158
Date d'inscription
samedi 22 juin 2002
Statut
Membre
Dernière intervention
27 juin 2015
1
Merci, cela fonctionne, je peux maintenant modifier mes paramètres au niveau de mon fichier XML :)

Juste une drnière précision, avant que je valide ta réponse,
Si je parviens bien à rajouter des éléments dans mon fichier sitemap, (ex : toto="test")
Je ne parviens pas à y accéder au niveau de mon code...
SiteMap MySiteMap;
MySiteMap.ChildNodes[0].toto n'existe pas...

Je ne vois pas comment le rajouter... ??

****************************************************
Il n'y a pas de pb sans solutions : il faut juste trouver le temps pour les chercher
Messages postés
148
Date d'inscription
vendredi 28 avril 2006
Statut
Membre
Dernière intervention
1 décembre 2009

Voila un exemple tout simple de comment tu peut recuperer les infos :



XmlDocument



XmlDoc =

new



XmlDocument
();
XmlDoc.Load(

"MonWeb.sitemap"
);


XmlNodeList
xmlnodelist = XmlDoc.GetElementsByTagName(

"siteMapNode"
);


string
xmlnode = xmlnodelist.Item(0).Attributes[

"toto"
].InnerText;

Sinon après je te conseil d'effectuer une boucle qui poura parser de fond en comble ton fichier et ainsi recuperer toute les info, un truc de ce genre quoi :

XmlDocument
xmlLink =
new
XmlDocument();
xmlLink.Load(
"MonWeb.sitemap");

XmlNodeList listLinks = xmlLink.GetElementsByTagName(
"siteMapNode");

foreach (
XmlNode link
in xmlLink.GetElementsByTagName(
"siteMapNode"))
{

      if (link.Attributes[
"monAttribut"].Value ==
"Test")
         {
              tmp = link.InnerText;
          }
}
Messages postés
158
Date d'inscription
samedi 22 juin 2002
Statut
Membre
Dernière intervention
27 juin 2015
1
Ce n'est pas possible de passer par SiteMapNode plutot ?
Tu vas me dire que SiteMapNode n'est pas assez générique pour ce que je veux faire j'imagine...

****************************************************
Il n'y a pas de pb sans solutions : il faut juste trouver le temps pour les chercher
Messages postés
158
Date d'inscription
samedi 22 juin 2002
Statut
Membre
Dernière intervention
27 juin 2015
1
En fait pourquoi je souhaite passer par SiteMapNode plutot, c'est que je gère les "levels" de mon arborescence, d'une part et que d'autre part, je gère les "roles"...

Donc deux cas de figure, soit je passe tout en XMLNode, et je perds l'intérêt de passer par les SiteMapNode,
soit je garde mes XMLNode, et mes SiteMapNode, mais j'ai deux "navigations" sur un même fichier XML en même temps...
pas top, niveau propreté de codage...

En fait, le gros hic, c'est que la propriété "Attributes" n'est malheureusement pas accessible dans SiteMapNode... si c'était le cas, ça résoudrait bien mes problèmes...

****************************************************
Il n'y a pas de pb sans solutions : il faut juste trouver le temps pour les chercher
Messages postés
148
Date d'inscription
vendredi 28 avril 2006
Statut
Membre
Dernière intervention
1 décembre 2009

Une question, quel genre d'info tu va stocker dans ton web.sitemap ?
Messages postés
158
Date d'inscription
samedi 22 juin 2002
Statut
Membre
Dernière intervention
27 juin 2015
1
Une adresse URL, une description un title, et surtout des roles...

L'idée étant de créer un menu "dynamique" en fonction de mes rôles.

Sachant aussi que l'on gère les autorisations des différentes pages en fonction d'un SiteMapProvider, se basant donc sur les roles de ce siteMap...

Et donc, on souhaite rajouter un attribut, pour avoir en fait une image pour chaque Menu ou URL (afin de préciser, les URL fonctionnelles, en travaux, etc... ce qui ne peut aps être fait de manière statique..)

****************************************************
Il n'y a pas de pb sans solutions : il faut juste trouver le temps pour les chercher
Messages postés
148
Date d'inscription
vendredi 28 avril 2006
Statut
Membre
Dernière intervention
1 décembre 2009

Dans ton cas tu doit faire une class qui dérive de la class XmlSiteProvider pour aboutir à tes besoins.
Mais avant je te conseil de jeter un coup d'oeil sur ça : ça devrait beaucoup t'intéresser ...
Messages postés
158
Date d'inscription
samedi 22 juin 2002
Statut
Membre
Dernière intervention
27 juin 2015
1
Article intéressant en effet :)
J'en avais entendu parler, mais le voir d'une manière plus approfondie est un bon point...

Cependant, mon supérieur n'est pas chaud pour qu'on le mettre en place... Je vais donc devoir rester sur la première solution...

Tu parles de dériver la class XMLSiteProvider, peux tu m'en dire plus ? J'avais plus penser à dériver la classe SiteMapNode  mais je ne vois pas comment m'y prendre...

Car au final, on utilise le SiteMap.Provider à un seul moment : (sauf si je me trompe)

        SiteMapNodeCollection MyCollection = SiteMap.Provider.GetChildNodes(SiteMap.Provider.RootNode);

       foreach (SiteMapNode MyItem in MyCollection)
        {
            if (MyItem.ChildNodes.Count > 0)
            {
                // On prépare le nb de Childs
                liNbChild = MyItem.ChildNodes.Count;
               
                for(liNbChildCompteur=0;liNbChildCompteur<liNbChild;liNbChildCompteur++)
                {
                    // vérification qu'on est bien dans une page ou seul le role "toto" est affiché
                    if (!MyItem.ChildNodes[liNbChildCompteur].Roles.Contains("toto"))
                        {
                               // Récupération de l'url
                               HyperLink MyHL = new HyperLink();
                               MyHL.PostBackUrl = MyItem.ChildNodes[liNbChildCompteur].Url;
                               // Récupération de l'attribut que j'ai rajouté dans mon XSD (??? c'est pour cette ligne qu'il faudrait dériver                                // le SiteMapNode je pense... mais comment s'y prendre ?
                               MyHL.SkinID = MyItem.ChildNodes[liNbChildCompteur].MySkinID;// (cette ligne ne marche pas hein...)
                        }
                   // ...
                   }
    //...
}

****************************************************
Il n'y a pas de pb sans solutions : il faut juste trouver le temps pour les chercher
Messages postés
158
Date d'inscription
samedi 22 juin 2002
Statut
Membre
Dernière intervention
27 juin 2015
1
Merci pour le temps consacré à ces réponses :))

C'est (e.Item.DataItem
asSiteMapNode)[
"ImageUrl"]; qui m'intéressait.

Je l'ai modulé un peu vu que je passe par un menu Krosoft...
En fait, je me cassais à chercher un truc "caseSensitive" alors qu'en fait, c'était simple...

Un grand merci donc pour ton aide lasaad83 ^^

****************************************************
Il n'y a pas de pb sans solutions : il faut juste trouver le temps pour les chercher
Messages postés
148
Date d'inscription
vendredi 28 avril 2006
Statut
Membre
Dernière intervention
1 décembre 2009

Content de t'avoir aidé ....