使用LINQ to XML获取特定记录

时间:2011-07-08 18:05:38

标签: c# linq-to-xml

我们将静态数据存储在具有不同数据分组的XML文件中。该文件实际上非常大,我已经减少了这个问题。其中每一项都是其数据的一小部分。

<?xml version="1.0" encoding="utf-8" ?>
<datasets>
    <dataset id="USRegions">
        <record code="SoCal">Southern California</record>
        <record code="NoCal">Northen California</record>
    </dataset>
    <dataset id="Countries">
        <record code="US" callingcode="1|US">United States</record>
        <record code="CA" callingcode="1|CA">Canada</record>
        <record code="GB" callingcode="44|GB">United Kingdom</record>
        <record code="MX" callingcode="52|MX">Mexico</record>
    </dataset>
</datasets>

出于验证的目的,我想确保传入的国家代码(例如“US”)存在于静态数据中。我可以使用此查询访问记录集,但我对如何深入挖掘数据感到困惑。

var dataset = from record in _xAddressData.Descendants("dataset")
          where (string) record.Attribute("id") == "Countries"
          select record.DescendantNodes();

3 个答案:

答案 0 :(得分:2)

试试这个

var dataset = from dataset in _xAddressData.Descendants("dataset")
          let codes = dataset.Descendants("record").Select(r => r.Attribute("code").Value)
          where (string) dataset.Attribute("id") == "Countries" &&
          codes.All(c => MyListOfCountryCodes.Contains(c))
          select record.DescendantNodes();

答案 1 :(得分:1)

一种方法:

static bool HasCountry(this XDocument document, string country)
{
    return document.Root.Elements("dataset")
                        .Any(d => (string)d.Attribute("id") == "Countries"
                          && d.Elements("record")
                              .Any(r => (string)r.Attribute("code") == country));
}

用过:

var hasUS = _xAddressData.HasCountry("US");

答案 2 :(得分:0)

我将以使用扩展方法的形式回答(我认为它们更加整洁)

var findKey = "US";
var rows = doc.Descendants("dataset")
    .Single(x=> x.Attribute("id").Value == "Countries")
    .Elements()
    .Where(x => x.Attribute("code").Value == findKey);

当然,如果您要做的只是有一个布尔值来说明元素是否存在,只需将Where替换为Any

var keyExists = doc.Descendants("dataset")
    .Single(x=> x.Attribute("id").Value == "Countries")
    .Elements()
    .Any(x => x.Attribute("code").Value == findKey);