Eu tenho um XDocument
objeto Desejo consultar elementos com um nome específico em qualquer profundidade usando o LINQ. Quando uso Descendants("element_name")
, recebo apenas elementos que são filhos diretos do nível atual. O que estou procurando é o equivalente a "// element_name" no XPath ... devo apenas usar XPath
ou existe uma maneira de fazê-lo usando os métodos LINQ? Obrigado.
143
doc.Descendants("Cars").Descendants("Part")
(ou, eventualmente,.Elements("Part")
se fossem apenas crianças diretos.var foo = new XDocument().Descendants("Bar").Descendants("Baz");
porqueDescendants
retorna um vazioIEnumerable<XElement>
e nãonull
.Um exemplo indicando o espaço para nome:
fonte
Você pode fazer desta maneira:
onde
xml
é umaXDocument
.Esteja ciente de que a propriedade
Name
retorna um objeto que possui aLocalName
e aNamespace
. É por isso que você precisa usarName.LocalName
se quiser comparar pelo nome.fonte
Os descendentes farão exatamente o que você precisa, mas não se esqueça de incluir um nome de espaço para nome junto com o nome do elemento. Se você omitir, provavelmente receberá uma lista vazia.
fonte
Existem duas maneiras de conseguir isso,
A seguir, exemplos de como usar essas abordagens,
Se você usa o XPath, é necessário fazer alguma manipulação com o IEnumerable:
Observe que
resulta um ponteiro nulo ou nenhum resultado.
fonte
XPathEvaluate
está noSystem.Xml.XPath
espaço para nome.Estou usando o
XPathSelectElements
método de extensão que funciona da mesma maneira que oXmlDocument.SelectNodes
método:fonte
Após a resposta de @Francisco Goldenstein, escrevi um método de extensão
fonte
sabemos que o exposto acima é verdadeiro. Jon nunca está errado; desejos da vida real podem ir um pouco mais longe
Por exemplo, geralmente o problema é: como podemos obter o EchoToken no documento xml acima? Ou como desfocar o elemento com o nome attrbute.
1- Você pode encontrá-los acessando com o namespace e o nome como abaixo
2- Você pode encontrá-lo pelo valor do conteúdo do atributo, como este
fonte
Essa é minha variante da solução baseada no
Linq
método Descendants e daXDocument
classeResultados:
Para mais detalhes sobre o
Desendants
método, dê uma olhada aqui.fonte
(O código e as instruções são para C # e podem precisar ser ligeiramente alterados para outros idiomas)
Este exemplo funciona perfeitamente se você deseja ler de um Nó Pai que possui muitos filhos, por exemplo, observe o seguinte XML;
Agora, com este código abaixo (lembre-se de que o arquivo XML está armazenado em recursos (consulte os links no final do snippet para obter ajuda sobre recursos)) Você pode obter cada endereço de email na tag "emails".
Resultados
Nota: Para aplicativo de console e WPF ou Windows Forms, você deve adicionar o "using System.Xml.Linq;" Diretiva Using na parte superior do seu projeto, para o Console, você também precisará adicionar uma referência a este espaço para nome antes de adicionar a diretiva Using. Também para o Console, por padrão, não haverá arquivo de recursos na "pasta Propriedades", portanto você deve adicionar manualmente o arquivo de recursos. Os artigos do MSDN abaixo explicam isso em detalhes.
Adicionando e editando recursos
Como: Adicionar ou remover recursos
fonte