Запросить XML-файл, используя linq to xml? - PullRequest
1 голос
/ 20 декабря 2011

У меня есть следующий 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 to xml, чтобы получить значение male в зависимости от местоположения клиента.

Вот запрос:

  var Male = from e in doc.Descendants("Male")
             select new
             {
                 Male = e.Attribute("Value").Value.ToString()
             };

Я могу получить значение для мужчины, но меня смущает, как получить имя на основе местоположения клиента в XML-файле. Как добавить здесь условие where, которое определяет местоположение клиента. Буду признателен, если кто-нибудь поможет мне.

Ответы [ 3 ]

0 голосов
/ 20 декабря 2011

По вашему вопросу - чтобы выбрать значение имя в зависимости от местоположения, вы можете использовать что-то вроде:

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;
}
0 голосов
/ 20 декабря 2011

Для чего-то подобного мне действительно нравятся методы расширения XML SafeElement и SafeAttribute, поскольку они позволяют запрашивать XML, не беспокоясь о том, чтобы столкнуться с нулевыми значениями, если XML не содержит указанных вами элементов или атрибутов.

Код для этих методов расширения здесь:

    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 отсутствует, вы получите пустой набор результатов вместо исключений.

0 голосов
/ 20 декабря 2011

Вы хотите выполнить предложение where для элементов Customer, прежде чем получать мужчин.Так что-то вроде этого:

var males = from customer in doc.Descendants("Customer")
            where "NY".Equals(customer.Attribute("Location").Value)
            select customer.Descendants("Male");

Примечание: это не было проверено, но оно должно дать вам некоторое представление о том, как действовать.Проверьте эту статью MSDN по ключевому слову where для получения дополнительной информации.

Кроме того, если это помогает, я всегда предпочитаю использовать LINQ Extensions для перечисляемых коллекций.Я считаю, что их гораздо легче читать и писать, чем ключевые слова предложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...