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