LINQ TO XML Query with Optional Widget

Asked

Viewed 158 times

2

Hello folks I’m having a question to display the data of a file XML through a consultation LINQ , the problem is that I am trying to consult the data of the person but the mandatory filling and name and CPF or CNPJ so in some cases there are no records of Endereço and Contato then the exception Nullreferenceexception and launched how I can solve this ?

Structure of the xml File

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

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

Obs : I know I can build a better structure but in this case I can’t make any modifications .

  • 1

    See if the p.Element ("Address") element has value before accessing its "Value".. Type p.Element("Address") != null ? p.Element("Address"). Element("City") != null ? p.Element("Address"). Element("City"). Value : "" : "";

  • 1

    Tests if it is null before. Address = p.Element("Address"). Element("Address"). Value == null ? "" p.Element("Address"). Element("Address"). Value

1 answer

1


A block try ... catch solve this well, no?

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 even, iterate in a way that the try ... catch stay inside the block:

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

Browser other questions tagged

You are not signed in. Login or sign up in order to post.