user2939293
user2939293

Reputation: 813

XML Get element based on attribute

Can someone please help me. I'm new to XML and xElement. How can I get number of men where year = 2013? The result should be 300.

I have this XML:

<company>
  <department>
    <departmentname>Dep 1</departmentname>
    <year id = "2012">
      <men>200</men>
      <women>1000</women>
    </year>
    <year id = "2013">
      <men>300</men>
      <women>400</women>
    </year>
  </department>
</company>

I have this code (not working):

XElement company = XElement.Load(Server.MapPath(myXML.xml));
var men = (from a in company.Elements("department").Elements("year")
           where (string)a.Attribute("id").Value == "2013"
           select (string)(a.Element("men"))).ToList<string>();

Upvotes: 1

Views: 1527

Answers (4)

user2939293
user2939293

Reputation: 813

Ok guys. I used this and it's working Thank you for your help!

 XElement com = (from p in company.Elements("department")
                                    where (string)p.Element("departmentname").Value == "Dep 1"
                                    select p).First();



    var men= (from a in com.Elements("year")
                              where (string)a.Attribute("id") == "2013"
                              select (string)(a.Element("men"))).ToList<string>();

Upvotes: 0

Rubens Farias
Rubens Farias

Reputation: 57996

What about using XPath?

var xmldoc = XDocument.Parse(@"<?xml version='1.0' encoding='utf-8'?>
    <company>
      <department>
        <departmentname>Dep 1</departmentname>
        <year id = '2012'>
          <men>200</men>
          <women>1000</women>
        </year>
        <year id = '2013'>
          <men>300</men>
          <women>400</women>
        </year>
      </department>
    </company>");

Console.WriteLine(
    xmldoc.XPathSelectElement(
            "/company/department/year[@id='2013']/men").Value);

Upvotes: 1

Ben
Ben

Reputation: 1963

XElement company = XElement.Load(Server.MapPath(myXML.xml));

var txt = company.Descendants("men")
    .First(x => int.Parse(x.Parent.Attribute("id").Value) == 2013).Value;

Not very robust but will do the job in your case and you should get the idea.

And with LINQ syntax rather than extension method:

var txt =
    (from c in company.Descendants("men")
     where c.Parent.Attribute("id").Value == "2013"
     select c).First().Value;

Upvotes: 0

Anirudha
Anirudha

Reputation: 32817

Assuming you want it from all departments

int mens=company.Descendants("year")
                .Where(x=>x.Attribute("id").Value=="2013")
                .Sum(x=>int.Parse(x.Element("men").Value));

Your query should be

int men = (from a in company.Elements("department").Elements("year")
           where a.Attribute("id").Value == "2013"
           select int.Parse(a.Element("men").Value)).Sum();

Upvotes: 0

Related Questions