0

有人可以帮我解决这个问题。我有一个 Web 应用程序,需要执行以下操作:如何获取所有性别为“男性”且日期从 2013 年开始的人的年龄

非常感谢你的帮助

我有这个 XML:

<company>
  <department>
    <departmentname>Dep 1</departmentname>
    <people>
      <person>
        <name>Sean</name>
        <date>2011-10-10</date>
        <gender>male</gender>
        <age>40</age>
      </person>
      <person>
        <name>John</name>
        <date>2013-10-18</date>
        <gender>male</gender>
        <age>45</age>
      </person>
      <person>
        <name>Linda</name>
        <date>2012-09-10</date>
        <gender>female</gender>
        <age>42</age>
      </person>
      <person>
        <name>Bob</name>
        <date>2013-10-01</date>
        <gender>male</gender>
        <age>35</age>
      </person>
    </people>
  </department>
  <department>
    <departmentname>Dep 2</departmentname>
    <people>
      <person>
        <name>Art</name>
        <date>2012-09-10</date>
        <gender>male</gender>
        <age>38</age>
      </person>
      <person>
        <name>Christina</name>
        <date>2013-10-20</date>
        <gender>female</gender>
        <age>45</age>
      </person>
      <person>
        <name>Marie</name>
        <date>2011-09-10</date>
        <gender>female</gender>
        <age>49</age>
      </person>
    </people>
  </department>
</company>

这是我的 C# 代码:

string year = "2013";

protected List<string> GetPersons(string year)
{
    XElement company= XElement.Load(Server.MapPath(XMLfil));

    var persons= (from a in company.Elements("department").Elements("people").Elements("person")
                  where (string)a.Element("gender").Value == 'male' && (string)a.Element("date").Value == STARTS WITH 2013
                  select (string)(a.Element("age"))).ToList<string>();
    return persons; 
}
4

4 回答 4

1
string year = "2013";

protected List<string> GetPersons(string year)
{
    XElement company= XElement.Load(Server.MapPath(XMLfil));

    var persons= (from a in company.Elements("department").Elements("people").Elements("person")
                  where (string)a.Element("gender").Value == 'male' && (string)a.Element("datum").Value.StartsWith(year)
                  select (string)(a.Element("age"))).ToList<string>();
    return persons;
}

或者尝试 DateTime.Parse 并仅比较年份。例如,当您的 xml 中的日期格式发生更改时,情况会更好。

于 2013-11-08T09:06:53.050 回答
1
from p in company.Descendants("person")
let date = (string)p.Element("date")
where (string)p.Element("gender") == "male" &&
      date != null && date.StartsWith(year) // pass year as a string
select (string)p.Element("age")

输出:

45
35

但我建议您创建接受整数值(因此年份数是整数)并返回整数值列表(因为年龄是整数)的方法。还要为方法使用自我描述的名称,这表明您的意图:

protected List<int> GetMaleAges(int year)
{
    var company= XElement.Load(Server.MapPath(XMLfil));
    var ages = from p in company.Descendants("person")
               let date = (DateTime?)p.Element("date") // use DateTime
               where (string)p.Element("gender") == "male" &&
                     date.HasValue && date.Value.Year == year
               select (int)p.Element("age")

    return ages.ToList();
}

注意:您也可以将日期作为DateTime值而不是字符串

from p in company.Descendants("person")
let date = (DateTime?)p.Element("date")
where (string)p.Element("gender") == "male" &&
       date.HasValue && date.Value.Year == year // pass year as integer
select (int)p.Element("age")

您也可以使用 XPath(最简洁的解决方案)

string xpath = String.Format(
   "//person[gender='male' and date[starts-with(., '{0}')]]/age", year);
return company.XPathSelectElements(xpath).Select(a => (int)a);
于 2013-11-08T09:07:12.443 回答
0

您可以尝试使用“包含”( String.Contains) 检查,这样如果日期格式发生更改,那么您的查询也将起作用。

var persons = (from a in company.Descendants("person")
                   where a.Element("gender").Value.ToLower() == "male" && a.Element("date").Value.Contains("2013")
                   select a.Element("age").Value).ToList<string>();
于 2013-11-08T11:57:09.063 回答
0

感谢你们!我从未听说过 StartsWith。多亏了你,它现在可以工作了!

这是我的解决方案:

string year = "2013";

protected List<string> GetPersons(string year)
{
    XElement company= XElement.Load(Server.MapPath(XMLfil));

    var persons= (from a in company.Elements("department").Elements("people").Elements("person")
                  where (string)a.Element("gender").Value == 'male' && a.Element("date").Value.StartsWith(year)                      
                 select (string)(a.Element("age"))).ToList<string>();
    return persons; 
}
于 2013-11-08T16:17:34.700 回答