Usuário com melhor resposta
LINQ To xml

Pergunta
-
Olá pessoal, uma dúvida me assola a mente...
Tenho o seguinte schema xml com 3 opções dentro do "choice", sendo o elemento "codigoPrestadorNaOperadora" um Complex Type.
<element name="origem"> <complexType> <choice> <element name="codigoPrestadorNaOperadora" type="ans:ct_identificacaoPrestadorExecutante"/> <element name="registroANS" type="ans:st_registroANS"/> <element name="cnpjPagador" type="ans:st_CNPJ"/> </choice> </complexType> </element>
Os elementos deste Complex Type estão definidos a seguir:
<complexType name="ct_identificacaoPrestadorExecutante"> <choice> <element name="CNPJ" type="ans:st_CNPJ"/> <element name="CPF" type="ans:st_CPF"/> <element name="codigoPrestadorNaOperadora" type="ans:st_codigoPrestadorNaOperadora"/> </choice> </complexType>
Para obter os dados desta estrutura eu preciso verificar quais valores foram informados e então armazenar uma string vazia nos demais. Para tanto, utilizo o seguinte comando LINQ:
var Result = from a in CabecalhoTransacao select new { origemRegistroANS = a.Element(ns + "origem").Element(ns + "registroANS") != null ? a.Element(ns + "origem").Element(ns + "registroANS").Value.Trim() : string.Empty, origemCnpjPagador = a.Element(ns + "origem").Element(ns + "cnpjPagador") != null ? a.Element(ns + "origem").Element(ns + "cnpjPagador").Value.Trim() : string.Empty, destinoRegistroANS = a.Element(ns + "destino").Element(ns + "registroANS") != null ? a.Element(ns + "destino").Element(ns + "registroANS").Value.Trim() : string.Empty, destinoCnpjPagador = a.Element(ns + "destino").Element(ns + "cnpjPagador") != null ? a.Element(ns + "destino").Element(ns + "cnpjPagador").Value.Trim() : string.Empty, versaoPadrao = a.Element(ns + "versaoPadrao").Value.Trim() };
Gostaria de saber como faço para verificar no XML quais valores foram informados dentro do elemento "codigoPrestadorNaOperadora", pois este elemento nem sempre vai existir, sendo assim não posso fazer como no exemplo acima pq gera um erro de referência ao objeto...
Respostas
-
Boa tarde Alexandre, agradeço pelo post, mas na verdade já achei uma maneira de fazer essa verificação. Só utilizei o operador "&&", ficou mais ou menos assim:
origemCNPJ = a.Element(ns + "origem").Element(ns + "codigoPrestadorNaOperadora") != null && a.Element(ns + "origem").Element(ns + "codigoPrestadorNaOperadora").Element(ns + "CNPJ") != null ? a.Element(ns + "origem").Element(ns + "codigoPrestadorNaOperadora").Element(ns + "CNPJ").Value.Trim() : string.Empty, origemCPF = a.Element(ns + "origem").Element(ns + "codigoPrestadorNaOperadora") != null && a.Element(ns + "origem").Element(ns + "codigoPrestadorNaOperadora").Element(ns + "CPF") != null ? a.Element(ns + "origem").Element(ns + "codigoPrestadorNaOperadora").Element(ns + "CPF").Value.Trim() : string.Empty
- Marcado como Resposta AndreAlvesLimaModerator sexta-feira, 21 de maio de 2010 22:12
Todas as Respostas
-
Poderia ter um let para guardar o elemento e depois, fazer a varificação, algo assim:
var Result = from a in CabecalhoTransacao
let ANS= a.Element(ns + "origem" ).Element(ns + "registroANS" ) let CNPJ = a.Element(ns + "origem" ).Element(ns + " cnpjPagador " )
//fazer para o resto
select new
{
origemRegistroANS = ANS == default(XElement) ? ANS.Value.Trim() : string .Empty,
//fazer para o resto
};
Minato alexandre.minato@hotmail.com - http://www.alexandreminato.com.br -
Boa tarde Alexandre, agradeço pelo post, mas na verdade já achei uma maneira de fazer essa verificação. Só utilizei o operador "&&", ficou mais ou menos assim:
origemCNPJ = a.Element(ns + "origem").Element(ns + "codigoPrestadorNaOperadora") != null && a.Element(ns + "origem").Element(ns + "codigoPrestadorNaOperadora").Element(ns + "CNPJ") != null ? a.Element(ns + "origem").Element(ns + "codigoPrestadorNaOperadora").Element(ns + "CNPJ").Value.Trim() : string.Empty, origemCPF = a.Element(ns + "origem").Element(ns + "codigoPrestadorNaOperadora") != null && a.Element(ns + "origem").Element(ns + "codigoPrestadorNaOperadora").Element(ns + "CPF") != null ? a.Element(ns + "origem").Element(ns + "codigoPrestadorNaOperadora").Element(ns + "CPF").Value.Trim() : string.Empty
- Marcado como Resposta AndreAlvesLimaModerator sexta-feira, 21 de maio de 2010 22:12