我有以下xml文件:
<?xml version="1.0" encoding="utf-8"?>
<Cus>
<Customer Location="NJ">
<Male Value="True" />
<Name Value="xxx" />
</Customer>
<Customer Location="NY">
<Male Value="True" />
<Name Value="yyy" />
</Customer>
</Cus>
我正在尝试使用linq查询xml,以便根据客户位置获取男性的价值。
以下是查询:
var Male = from e in doc.Descendants("Male")
select new
{
Male = e.Attribute("Value").Value.ToString()
};
我能够获得男性的价值,但我很困惑如何根据客户在xml文件中的位置获取名称。如何在此处添加where条件来确定客户的位置。如果有人可以指导我,我将不胜感激。
答案 0 :(得分:0)
您希望在获取男性之前对Customer元素执行where子句。所以像这样:
var males = from customer in doc.Descendants("Customer")
where "NY".Equals(customer.Attribute("Location").Value)
select customer.Descendants("Male");
注意:这尚未经过测试,但它应该为您提供一些指示。有关详细信息,请查看where
关键字上的MSDN article。
另外,如果它有帮助,我总是更喜欢使用LINQ Extensions来表示可枚举的集合。我发现它们比子句关键字更容易阅读和写作。
答案 1 :(得分:0)
根据您的问题 - 根据位置选择 name 的值,您可以使用以下内容:
private string CountOfMales(XDocument doc, string locationToFilter)
{
var selection = from customer in doc.Descendants("Customer")
.Where(c => c.Attribute("Location").Value == locationToFilter)
select new
{
MaleValue = customer.Element("Name").Attribute("Value").Value
};
return selection.FirstOrDefault().MaleValue;
}
答案 2 :(得分:0)
对于类似这样的东西,我非常喜欢XML扩展方法SafeElement和SafeAttribute,因为它们允许您查询XML,而不必担心如果XML不包含您指定的元素或属性,则会运行null值。
这些扩展方法的代码在这里:
public static XElement SafeElement(this XContainer container, string name)
{
return container.Element(name) ?? new XElement(name);
}
public static XAttribute SafeAttribute(this XElement element, string name)
{
return element.Attribute(name) ?? new XAttribute(name, "");
}
你这样使用它:
var customers = xdoc.Descendants("Customer")
.Where(x => x.SafeAttribute("Location").Value == "NJ")
.Select(x => x.SafeElement("Male").SafeAttribute("Value").Value);
如果出于某种原因,Location属性或Male元素不存在,则最终会得到一个空结果集而不是异常。