none
filtro em XML RRS feed

  • Pergunta

  • Pessoal, sou novato em C# Asp.Net. Tinha uma aplicação em PHP e estou usando ela como estudo,  migrando para .NET.

    Claro que estou apanhando um pouco, era esperado. 

    Hoje encontrei um problema e já procurei e não achei solução. Recorro aos "universitários" deste fórum kkkk

    Tenho uma tabela que é alimentada por um XML via dataSet. Vou colocar uns dados aqui que não são exatamente iguais ao meu caso, só para exemplificar. Tenho um xml que lista veículos, com campos como ID, marca, modelo, etc:

    Quando quero mostrar todos os veículos faço assim:

    //Lendo XML


            //Crio uma instância DataSet
            DataSet ds = new DataSet();

            //Com o método ReadXml carrego o documento XML no DataSet
            ds.ReadXml("http://localhost:54507/veiculos.xml");

            //Percorre todas as linhas do DataSet(Rows)
            foreach (DataRow a in ds.Tables["veiculo"].Rows)
            {

                //Exibe no Browser o conteúdo do elemento veiculos
                string marca = Convert.ToString(a["marca"]);
                string modelo = Convert.ToString(a["modelo"]);

       //... + outros campos

      Response.Write(marca);

              Response.Write(modelo);

    // ... + outros campos

               }

    Consigo usar os dados do modo que quiser... tabela, lista,....

    Mas meu problema é que não consigo filtrar para mostrar os dados de um veiculo com ID específico. Para mostrar detalhes de um veiculo em particular.

    Como usar filtro ao ler XML. Alguma sugestão?




    • Editado RonaldoDev segunda-feira, 27 de janeiro de 2014 15:01 correção
    segunda-feira, 27 de janeiro de 2014 15:00

Respostas

  • Ronaldo,

    Aqui vai um exemplo com a classe XDocument:
    XDocument xDoc = XDocument.Load("http://localhost:54507/veiculos.xml");
    
    //Vamos supor que seu xml tenha esta estrutura
    //--veiculos
    //----veiculo
    //-------marca
    //-------modelo
    
    var result = xDoc.Descendants("veiculo");
                
    foreach (var element in xDoc.Descendants("veiculo"))
    {
        string marca = element.Element("marca").Value;
        string modelo = element.Element("modelo").Value;
    
        //... + outros campos
    
        Response.Write(marca);
        Response.Write(modelo);
    
        // ... + outros campos
    }

    Agora uma simples consulta validando o id do veiculo, exemplo:
    //Vamos supor que seu xml tenha esta estrutura
    //--veiculos
    //----veiculo (o veiculo possui um atributo chamado id --> <veiculo id="1">bla bla bla</veiculo>
    //-------marca
    //-------modelo
    
    var result = xDoc.Descendants("veiculo").Where(element => element.Attribute("Id").Value == "1");

    Não se esqueça do namespace para se trabalhar come sta classe, estar usando do .NET 4 ou versão superior:
    using System.Xml.Linq;


    Vitor Mendes | http://www.vitormendes.com.br/

    "Ajuda teu semelhante a levantar a sua carga, porém, não a carregá-la." (Pitágoras)

    • Marcado como Resposta Giovani Cr quarta-feira, 29 de janeiro de 2014 11:03
    segunda-feira, 27 de janeiro de 2014 19:19

Todas as Respostas

  • Olá Ronaldo,

    Você usar do método Select nos seus DataTables contido no na propriedade Tables do seu DataSet, um exemplo:

    var result = ds.Tables["veiculos"].Select("Id > 1");
    http://msdn.microsoft.com/en-us/library/det4aw50(v=vs.110).aspx

    Seria ainda melhor se você usa-se classes próprias para se trabalhar com XML (XDocument, XmlDocument e XmlReader) pois elas lhe oferecem suporte nativo ao XPath, um recurso muito poderoso para realizar filtros em XMLs.

    Vitor Mendes | http://www.vitormendes.com.br/

    "Ajuda teu semelhante a levantar a sua carga, porém, não a carregá-la." (Pitágoras)

    segunda-feira, 27 de janeiro de 2014 15:28
  • Ok. Poderia dar um exemplo usando o que citou? Obg
    segunda-feira, 27 de janeiro de 2014 18:42
  • Ronaldo,

    Aqui vai um exemplo com a classe XDocument:
    XDocument xDoc = XDocument.Load("http://localhost:54507/veiculos.xml");
    
    //Vamos supor que seu xml tenha esta estrutura
    //--veiculos
    //----veiculo
    //-------marca
    //-------modelo
    
    var result = xDoc.Descendants("veiculo");
                
    foreach (var element in xDoc.Descendants("veiculo"))
    {
        string marca = element.Element("marca").Value;
        string modelo = element.Element("modelo").Value;
    
        //... + outros campos
    
        Response.Write(marca);
        Response.Write(modelo);
    
        // ... + outros campos
    }

    Agora uma simples consulta validando o id do veiculo, exemplo:
    //Vamos supor que seu xml tenha esta estrutura
    //--veiculos
    //----veiculo (o veiculo possui um atributo chamado id --> <veiculo id="1">bla bla bla</veiculo>
    //-------marca
    //-------modelo
    
    var result = xDoc.Descendants("veiculo").Where(element => element.Attribute("Id").Value == "1");

    Não se esqueça do namespace para se trabalhar come sta classe, estar usando do .NET 4 ou versão superior:
    using System.Xml.Linq;


    Vitor Mendes | http://www.vitormendes.com.br/

    "Ajuda teu semelhante a levantar a sua carga, porém, não a carregá-la." (Pitágoras)

    • Marcado como Resposta Giovani Cr quarta-feira, 29 de janeiro de 2014 11:03
    segunda-feira, 27 de janeiro de 2014 19:19
  • Valeu Vitor. Vou testar agora. Trabalho muito bem com PHP  e alguma experiência de POO com java. Para ser sincero, acho java complicado demais e com uma longa curva de aprendizado. Estou começando a aprender C# Asp.Net.  Parece-me mais produtiva e rápida.  Abs. 
    terça-feira, 28 de janeiro de 2014 01:47