Использование LINQ to XML для получения конкретной записи - PullRequest
1 голос
/ 08 июля 2011

Мы храним статические данные в 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 ]

2 голосов
/ 08 июля 2011

Попробуйте это

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 голос
/ 08 июля 2011

Один подход:

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");
0 голосов
/ 08 июля 2011

Я отвечу в форме использования методов расширения (я просто думаю, что они намного более аккуратны)

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...