我们将静态数据存储在具有不同数据分组的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();
答案 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);