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 ..

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top