Объясните LINQ to XML для новичка ниже? - PullRequest
2 голосов
/ 17 марта 2009

Может кто-нибудь объяснить LINQ to XML ниже? Кроме того, как правильно проверить, вернул ли метод список с данными? Вы просто проверите, если список пуст.

Код:

public List<Listing> GetList()
{
    if (File.Exists(this.xmlFilePath))
    {
        XDocument doc = XDocument.Load(this.xmlFilePath);

        var listings = from row in doc.Root.Elements("listing")
                       select new Listing
                       {
                           A = (string)row.Element("A"),
                           B = (string)row.Element("B"),
                           C = (string)row.Element("C"),
                           D = (string)row.Element("D"),
                           E = (string)row.Element("E")
                       };

        return listings.ToList();
    }
    else
    {
        return new List<Listing>();
    }
}

XML:

<Listings>
   <listing>
     <a>A</a>
     <b>B</b>
     <c>C</c>
     <d>D</d>
     <e>E</e>
    </listing>
    <listing>
     <a>F</a>
     <b>G</b>
     <c>C</c>
     <d>H</d>
     <e>I</e>
    </listing>
</Listings>

1 Ответ

2 голосов
/ 17 марта 2009

Вы можете проверить, есть ли у listings какие-либо данные, изучив результат метода Count() для переменной listings, и ответить на вопрос, заданный в разделе комментариев ниже: «Таким образом, нет способа на самом деле вернуть null? Я должен вернуть List<listing>() объект? ", пожалуйста, смотрите следующий код:

public List<Listing> GetList()
{
  if (File.Exists(this.xmlFilePath))
  {
    XDocument doc = XDocument.Load(this.xmlFilePath);

    var listings = from row in doc.Root.Elements("listing")
             select new Listing
             {
               A = (string)row.Element("A"),
               B = (string)row.Element("B"),
               C = (string)row.Element("C"),
               D = (string)row.Element("D"),
               E = (string)row.Element("E")
             };

    // Check if we have any matches         
    if(listings.Count() > 0)
    {
      return listings.ToList();
    }

    return null;
  }
  return null;
}

Я думаю, это то, что вы ищете.

Не так много объяснений о том, как работает код. В первой части запроса:

var listings = from row in doc.Root.Elements("listing")

Выражение doc.Root.Elements("listing") выделяет все элементы <listing> ниже корня документа (<Listings>).

Вторая часть запроса создает новый объект Listing для каждого элемента <listing> и присваивает внутренний текст каждого из дочерних элементов A,B,C,D и E каждому из A,B,C,D и * 1024. * свойства каждого нового Listing созданного объекта.

Строка, содержащая: return listings.ToList(); возвращает общий List<T> из Listing объектов.

Используя предоставленный пример XML, вы обнаружите, что для каждого Listing объекта A,B,C,D, и E свойства будут null. Это связано с тем, что регистр символов каждого из селекторов row.Element() отличается от запрашиваемого XML, т. Е. Ваш XML имеет <a>, а row.Element("A") использует верхний регистр 'A'. Соответствие узла XML в LINQ to XML чувствительно к регистру.

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