LINQ TO XML Query with Optional Element

2
Hello everyone, I am having a question about displaying the data from an XML file through a LINQ query , the problem is that I am trying to query the person's data but the and then the NullReferenceException and Endereço and NullReferenceException Launched how can I solve this?

xml file structure

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

LINQ TO XML Query

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

Obs : I know I can build a better structure but in this case I can not make any changes.

    
asked by anonymous 30.10.2015 / 19:32

1 answer

1

A block try ... catch solves this well, does not it?

try 
{
    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,
                };
} catch (Exception e) { /* Trate os problemas aqui */ }

Or, iterate in a way that try ... catch stays inside the block:

foreach (var p in xmldoc.Descendants("Pessoa"))
{
    try { /* Coloque a atribuição aqui */ }
    catch { /* Trate problemas de referência nula aqui */ }
}
    
01.04.2016 / 21:25