none
Listar nó de um SiteMap em um ListBox RRS feed

  • Pergunta

  • Boa tarde,

    Tenho um arquivo Xml no caso SiteMap, no caso tenho que listar o nó de cada menu

    Segue um exemplo do meu SiteMap

    <?xml version="1.0" encoding="utf-8"?>
    <siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0">
      <siteMapNode url="" title="" description="" roles="*">
        <siteMapNode url="~/1.aspx" title="1" description="1" roles="*" />
        <siteMapNode url="" title="2" description="2" roles="*">
          <siteMapNode url="~/Cadastro/2.1.aspx" title="2.1" description="2.1" roles="*">    
          </siteMapNode>
          <siteMapNode url="~/Cadastro/2.2.aspx" title="2.2" description="2.2" roles="*">
          </siteMapNode>
          <siteMapNode url="~/Cadastro/2.3.aspx" title="2.3" description="2.3" roles="*">
          </siteMapNode>
          <siteMapNode url="~/Cadastro/2.4.aspx" title="2.4" description="2.4" roles="*">
          </siteMapNode>
          <siteMapNode url="~/Cadastro/2.5.aspx" title="2.5" description="2.5" roles="*">
          </siteMapNode>
          <siteMapNode url="~/Cadastro/2.6.aspx" title="2.6" description="2.6" roles="*">
          </siteMapNode>
        </siteMapNode>
        <siteMapNode url="" title="3" description="3" roles="*">
          <siteMapNode url="~/Consultas/3.1.aspx" title="3.1" description="3.1" roles="*" />
          <siteMapNode url="~/Consultas/3.2.aspx" title="3.2" description="3.2" roles="*" />
          <siteMapNode url="~/Consultas/3.3.aspx" title="3.3" description="3.3" roles="*" />
        </siteMapNode>  
      </siteMapNode>
    </siteMap>

    No caso meu menu esta assim 1 - 2 -3

    clicando no menu 2 irá expandir a lista de itens

    2.1

    2.2

    2.3

    assim por diante!

    Como posso fazer para listar todos os itens do menu 2 em um ListBox?

    No caso eu consegui listar todos os item do SiteMap assim!

     XmlDocument xmlDoc = new XmlDocument();
                    xmlDoc.Load(Server.MapPath("~/Web.sitemap"));
                    XmlNodeList elementList = xmlDoc.GetElementsByTagName("siteMapNode");
                    foreach (XmlNode node in elementList)
                    {
                        if (node.Attributes["description"].Value != string.Empty)
                        {
                            ListBoxXml.Items.Add(node.Attributes["description"].InnerXml);
                        }
                    }
    Desde já muito obrigado!

    quinta-feira, 4 de fevereiro de 2016 18:22

Respostas

  • Assim:

    System.Xml.Linq.XName _descendants = System.Xml.Linq.XName.Get("siteMapNode", "http://schemas.microsoft.com/AspNet/SiteMap-File-1.0");                        
    	var c = (from items in System.Xml.Linq.XDocument.Parse(System.IO.File.ReadAllText("data.xml"))
    				.Descendants(_descendants)
    				let title = items.Attribute("title")
    				let url = items.Attribute("url")
    				let description = items.Attribute("description")
    				let roles = items.Attribute("roles")
    			 where title.Value.Contains("2.")
    			 select new
    			 {
    				 Title = title.Value, 
    				 Url = url.Value, 
    				 Description = description.Value, 
    				 Roles = roles.Value
    			 }).ToList();

    Nessa linha:

    where title.Value.Contains("2.")

    é o filtro então se você quer o número 3 você coloca 3.


    Fulvio C


    sexta-feira, 5 de fevereiro de 2016 01:11
  • Se você deseja pegar só os itens principais do menu seria essa! Na resposta anterior é pagar pegar os internos!
    System.Text.RegularExpressions.Regex regex = 
                    new System.Text.RegularExpressions.Regex("^[0-9]*$");
    
    System.Xml.Linq.XName _descendants = System.Xml.Linq.XName.Get("siteMapNode", "http://schemas.microsoft.com/AspNet/SiteMap-File-1.0");
    var c = (from items in System.Xml.Linq.XDocument.Parse(System.IO.File.ReadAllText("data.xml"))
    			.Descendants(_descendants)
    		 let title = items.Attribute("title")
    		 let url = items.Attribute("url")
    		 let description = items.Attribute("description")
    		 let roles = items.Attribute("roles")
    		 where (!string.IsNullOrEmpty(title.Value) && regex.IsMatch(title.Value))
    		 select new
    		 {
    			 Title = title.Value, 
    			 Url = url.Value, 
    			 Description = description.Value, 
    			 Roles = roles.Value
    		 }).ToList();


    Fulvio C

    • Marcado como Resposta Marcio Camargo sexta-feira, 5 de fevereiro de 2016 15:16
    sexta-feira, 5 de fevereiro de 2016 14:49

Todas as Respostas

  • Assim:

    System.Xml.Linq.XName _descendants = System.Xml.Linq.XName.Get("siteMapNode", "http://schemas.microsoft.com/AspNet/SiteMap-File-1.0");                        
    	var c = (from items in System.Xml.Linq.XDocument.Parse(System.IO.File.ReadAllText("data.xml"))
    				.Descendants(_descendants)
    				let title = items.Attribute("title")
    				let url = items.Attribute("url")
    				let description = items.Attribute("description")
    				let roles = items.Attribute("roles")
    			 where title.Value.Contains("2.")
    			 select new
    			 {
    				 Title = title.Value, 
    				 Url = url.Value, 
    				 Description = description.Value, 
    				 Roles = roles.Value
    			 }).ToList();

    Nessa linha:

    where title.Value.Contains("2.")

    é o filtro então se você quer o número 3 você coloca 3.


    Fulvio C


    sexta-feira, 5 de fevereiro de 2016 01:11
  • Obrigado pela atenção Fuvio!

    Você poderia me informar como eu posso listar os menus 1 - 2 - 3 no seu filtro?

    ficaria assim!

    1

    2

    3

    Eu sei que eu poderia estar filtrando assim!

    where title.Value.Equals("1") || title.Value.Equals("2") || title.Value.Equals("3")

    Mais no caso eu não sei quantos menus eu terei!

    Abs!

    sexta-feira, 5 de fevereiro de 2016 13:15
  • Se você deseja pegar só os itens principais do menu seria essa! Na resposta anterior é pagar pegar os internos!
    System.Text.RegularExpressions.Regex regex = 
                    new System.Text.RegularExpressions.Regex("^[0-9]*$");
    
    System.Xml.Linq.XName _descendants = System.Xml.Linq.XName.Get("siteMapNode", "http://schemas.microsoft.com/AspNet/SiteMap-File-1.0");
    var c = (from items in System.Xml.Linq.XDocument.Parse(System.IO.File.ReadAllText("data.xml"))
    			.Descendants(_descendants)
    		 let title = items.Attribute("title")
    		 let url = items.Attribute("url")
    		 let description = items.Attribute("description")
    		 let roles = items.Attribute("roles")
    		 where (!string.IsNullOrEmpty(title.Value) && regex.IsMatch(title.Value))
    		 select new
    		 {
    			 Title = title.Value, 
    			 Url = url.Value, 
    			 Description = description.Value, 
    			 Roles = roles.Value
    		 }).ToList();


    Fulvio C

    • Marcado como Resposta Marcio Camargo sexta-feira, 5 de fevereiro de 2016 15:16
    sexta-feira, 5 de fevereiro de 2016 14:49
  • Obrigado Fuvio,

    As duas condições eram necessárias!

    Ficou perfeito!

    Vlw!

    sexta-feira, 5 de fevereiro de 2016 15:16