使用linq查询xml文件到xml?

时间:2011-12-20 15:54:16

标签: c# linq-to-xml

我有以下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条件来确定客户的位置。如果有人可以指导我,我将不胜感激。

3 个答案:

答案 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元素不存在,则最终会得到一个空结果集而不是异常。