none
Consulta LINQ TO XML com Elemento opcional RRS feed

  • Pergunta

  • Olá pessoal estou com uma dúvida para exibir os dados de um arquivo XML através de uma consultaLINQ , o problema e que estou tentado consultar os dados da pessoa mas o preenchimento obrigatório e nome e CPF ou CNPJ portanto em alguns casos não existem os registro de EndereçoContato então a exceção NullReferenceException e lançada como posso resolver isso ?

    Estrutura do Arquivo xml

    <!--<?xml version="1.0" encoding="utf-8"?>-->
    <Lista>
      <Pessoa>
        <CpfCnpj></CpfCnpj>  <!-- Preenchimento Obrigatorio --> 
        <Nome></Nome>         <!-- Preenchimento Obrigatório --> 
        <Endereco>
          <Endereco></Endereco>
          <Numero></Numero>
          <Complemento>;</Complemento>
          <Bairro></Bairro>
          <Cidade></Cidade>
          <Uf></Uf>
          <Cep></Cep>
        </Endereco>
        <Contato>
          <Telefone></Telefone>
          <Email></Email>
        </Contato>
      </Pessoa>
    </Lista>

    Consulta LINQ TO XML

    static void Main(string[] args)
            {
                //Carrega Aquivo
                XDocument xmldoc = XDocument.Load("Database.xml");
    
                var ConsutarPessoas  = from p in xmldoc.Descendants("Pessoa")
                    select new
                        {
                            CpfCnpj     = p.Element("CpfCnpj").Value,
                            Nome        = p.Element("Nome").Value,
                            Endereco    = p.Element("Endereco").Element("Endereco").Value,
                            Numero      = p.Element("Endereco").Element("Numero").Value,
                            Complemento = p.Element("Endereco").Element("Complemento").Value,
                            Bairro      = p.Element("Endereco").Element("Bairro").Value,
                            Cidade      = p.Element("Endereco").Element("Cidade").Value,
                            Uf          = p.Element("Endereco").Element("Endereco").Value,
                            Cep         = p.Element("Endereco").Element("Uf").Value,
                            Telefone    = p.Element("Contato").Element("Telefone").Value,
                            Email       = p.Element("Contato").Element("Email").Value,
                        };
                //Exibir dados das pessoas 
                foreach (var PessoaRerefenciada in ConsutarPessoas)
                {
                    Console.WriteLine(PessoaRerefenciada.CpfCnpj);
                    Console.WriteLine(PessoaRerefenciada.Nome);
                    Console.WriteLine(PessoaRerefenciada.Endereco);
                    Console.WriteLine(PessoaRerefenciada.Complemento);
                    Console.WriteLine(PessoaRerefenciada.Numero);
                    Console.WriteLine(PessoaRerefenciada.Bairro);
                    Console.WriteLine(PessoaRerefenciada.Cidade);
                    Console.WriteLine(PessoaRerefenciada.Cep);
                    Console.WriteLine(PessoaRerefenciada.Telefone);
                    Console.WriteLine(PessoaRerefenciada.Email);
                    Console.WriteLine("----------------------");
                }
    
                Console.ReadKey();
            }
    sexta-feira, 30 de outubro de 2015 18:44

Respostas

  • Boa tarde.

    Tudo bem, Matheus?

    Não tenho certeza que vá funcionar (raramente uso o comando select new com LINQ), nem que seja a melhor forma, mas tente:

    select new
                        {
                            CpfCnpj     = p.Element("CpfCnpj").Value,
                            Nome        = p.Element("Nome").Value,
                            Endereco    = p.Elements("Endereco").Elements("Endereco").Select(x => x).FirstOrDefault(),
                            Numero      = p.Elements("Endereco").Elements("Numero").Select(x => (int)x).FirstOrDefault(),
                            Complemento = p.Elements("Endereco").Elements("Complemento").Select(x => x).FirstOrDefault(),
                            Bairro      = p.Elements("Endereco").Elements("Bairro").Select(x => x).FirstOrDefault(),
                            Cidade      = p.Elements("Endereco").Elements("Cidade").Select(x => x).FirstOrDefault(),
                            Uf          = p.Elements("Endereco").Elements("Endereco").Select(x => x).FirstOrDefault(),
                            Cep         = p.Elements("Endereco").Elements("Uf").Select(x => x).FirstOrDefault(),
                            Telefone    = p.Elements("Contato").Elements("Telefone").Select(x => x).FirstOrDefault(),
                            Email       = p.Element("Contato").Element("Email").Select(x => x).FirstOrDefault(),
                        };
    Lembrando de converter os valores que não são string (Numero, por exemplo).


    Att., Rafael Simor

    • Sugerido como Resposta SimorC domingo, 1 de novembro de 2015 22:57
    • Marcado como Resposta Marcos SJ segunda-feira, 2 de novembro de 2015 14:18
    sexta-feira, 30 de outubro de 2015 22:24

Todas as Respostas

  • Boa tarde.

    Tudo bem, Matheus?

    Não tenho certeza que vá funcionar (raramente uso o comando select new com LINQ), nem que seja a melhor forma, mas tente:

    select new
                        {
                            CpfCnpj     = p.Element("CpfCnpj").Value,
                            Nome        = p.Element("Nome").Value,
                            Endereco    = p.Elements("Endereco").Elements("Endereco").Select(x => x).FirstOrDefault(),
                            Numero      = p.Elements("Endereco").Elements("Numero").Select(x => (int)x).FirstOrDefault(),
                            Complemento = p.Elements("Endereco").Elements("Complemento").Select(x => x).FirstOrDefault(),
                            Bairro      = p.Elements("Endereco").Elements("Bairro").Select(x => x).FirstOrDefault(),
                            Cidade      = p.Elements("Endereco").Elements("Cidade").Select(x => x).FirstOrDefault(),
                            Uf          = p.Elements("Endereco").Elements("Endereco").Select(x => x).FirstOrDefault(),
                            Cep         = p.Elements("Endereco").Elements("Uf").Select(x => x).FirstOrDefault(),
                            Telefone    = p.Elements("Contato").Elements("Telefone").Select(x => x).FirstOrDefault(),
                            Email       = p.Element("Contato").Element("Email").Select(x => x).FirstOrDefault(),
                        };
    Lembrando de converter os valores que não são string (Numero, por exemplo).


    Att., Rafael Simor

    • Sugerido como Resposta SimorC domingo, 1 de novembro de 2015 22:57
    • Marcado como Resposta Marcos SJ segunda-feira, 2 de novembro de 2015 14:18
    sexta-feira, 30 de outubro de 2015 22:24
  • Bom dia,

    Por falta de retorno do usuário, esta thread será encerrada.

    Caso seja necessário, por gentileza, abra uma thread nova.

    Atenciosamente

    Marcos Roberto de Souza Junior

    Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as respostas que resolveram o seu problema. Essa e uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    segunda-feira, 2 de novembro de 2015 14:19