Por esta consulta XElement não está funcionando no meu xml
-
18-09-2019 - |
Pergunta
As minhas XML é semelhante:
<nodes>
<node name="somekey">
<item name="subject">blah</item>
<item name="body">body</item>
</node>
</nodes>
E o meu código até agora é:
XDocument doc = XDocument.Load(HttpContext.Current.Server.MapPath(String.Format("~/files/{0}/text.xml", "en")));
if (doc != null)
{
XElement element = doc.Elements().Where(e => e.Elements().Any() && e.Attribute("name").Value == "someKey").First();
}
Estou recebendo um erro dizendo:
Sequence contains no elements
É o meu errado consulta?
eu pisei através do código, e ele erros fora na linha com XElement ..
Solução
Você quer algo parecido com isto:
var element = doc.Descendants("node").Where(x => x.Attribute("name") != null && x.Attribute("name").Value == "somekey").FirstOrDefault();
Editar: Editado para agarrar primeiro elemento de resultado;
Outras dicas
Você também pode usar:
var element = doc.Elements()
.Elements()
.Where(e => (e.Elements().Any()
&& e.Attribute("name").Value == "somekey"))
.First();
Explicação:
O doc.Elements()
agarra o elemento raiz, que é nodes
. Em seguida, a .Elements()
seleciona os elementos filhos de que, o que é apenas um, node
. O .Where()
é então efectuada nesse nodeset, que é o que você quer. Os seleciona lambda aqueles elementos que têm elementos filhos, e também tem um "nome" atributo com valor "somekey".
O seu código original não estava recebendo a criança-elementos Criança-de-. Por isso, o conjunto de resultados original vazio.
Você também pode fazer isso com .Descendants()
mas que se sente um pouco desleixado e solto, para mim.