Wild Goat
Wild Goat

Reputation: 3579

C# Linq to XML query

<World>
  <Animals>
    <Tab>
      <Dogs id ="1">
        <Dog1></Dog1>
        <Dog2></Dog2>
        <Dog3></Dog3>
      </Dogs>
      <Dogs id ="2"></Dogs>
      <Dogs id ="3"></Dogs>
    </Tab>
  </Animals>
</World>

How do I get all elements under tag where id == 1?

My Linq query. (doesn't work) why?

XDocument xml= XDocument.Load(xml.xml);
var elements = from e in xml.Descendants("Animals").Descendants("Tab").Elements("Dogs")
where e.Attribute("id").toString().Equals("1")
select c;

Could you check it please?

Thanks!

Upvotes: 2

Views: 6120

Answers (3)

Henk Holterman
Henk Holterman

Reputation: 273244

From your sample data I think you want

//from e in xml.Descendants("Animals").Descendants("Tab").Elements("Dogs")
from e in xml.Descendants("Animals").Elements("Tab").Descendants("Dogs")

And in the same line, Descendants("Animals") could be Elements("Animals") if you want to enforce the structure.

For the rest your query looks OK.

Upvotes: 1

Phil
Phil

Reputation: 42991

Or use XPath:

xml.XPathSelectElements("/World/Animals/Tab/Dogs[@id=1]")

or

xml.XPathSelectElements("//Dogs[@id=1]")

which would find all Dogs wherever they occurred.

Upvotes: 1

sll
sll

Reputation: 62504

var result = xdoc.Descendants("World")
                 .Descendants("Animals")
                 .Descendants("Tab")
                 .Elements("Dogs")
                 .Where(n => n.Attribute("id").Value == "1");

Output:

<Dogs id="1">
  <Dog1></Dog1>
  <Dog2></Dog2>
  <Dog3></Dog3>
</Dogs>

Upvotes: 3

Related Questions