XML让日期从2013年开始的人们

时间:2013-11-08 08:57:09

标签: c# xml linq-to-xml

有人可以帮我解决这个问题。 我有一个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 个答案:

答案 0 :(得分: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中的日期格式发生变化时,这会更好。

答案 1 :(得分: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);

答案 2 :(得分: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>();

答案 3 :(得分: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; 
}