Запрос потомков в XML на Linq - PullRequest
2 голосов
/ 22 апреля 2010

У меня есть следующие данные xml:

<portfolio>
  <item>
    <title>Site</title>
    <description>Site.com is a </description>
    <url>http://www.site.com</url>
    <photos>
      <photo url="http://www.site.com/site/thumbnail.png" thumbnail="true" description="Main" />
      <photo url="http://www.site.com/site/1.png" thumbnail="false" description="Main" />
    </photos>
  </item>  
</portfolio>

В c # я использую следующий запрос ссылки:

List<PortfolioItem> list = new List<PortfolioItem>();
XDocument xmlDoc = XDocument.Load(HttpContext.Current.Server.MapPath("~/app_data/portfolio.xml"));

list = (from portfolio in xmlDoc.Descendants("item")
       select new PortfolioItem()
       {
           Title = portfolio.Element("title").Value,
           Description = portfolio.Element("description").Value,
           Url = portfolio.Element("url").Value
       }).ToList();

Как мне выполнить запрос узла фотографий?В классе PortfolioItem у меня есть свойство:

List<Photo> Photos {get;set;}

Любые идеи будут высоко оценены!

Ответы [ 3 ]

1 голос
/ 22 апреля 2010

Предполагая, что ваш класс Photo выглядит следующим образом:

class Photo
{
    public string Url { get; set; }
    public bool Thumbnail { get; set; }
    public string Description { get; set; }
}

Вы можете сделать это так:

list = (from portfolio in xmlDoc.Descendants("item")
        select new PortfolioItem()
        {
            Title = portfolio.Element("title").Value,
            Description = portfolio.Element("description").Value,
            Url = portfolio.Element("url").Value,
            Photos = portfolio
                         .Element("photos")
                         .Elements("photo")
                         .Select(e => new Photo {
                             Description = e.Attribute("description").Value,
                             Url = e.Attribute("url").Value,
                             Thumbnail = bool.Parse(e.Attribute("thumbnail").Value),
                         }).ToList()
        }).ToList();
1 голос
/ 22 апреля 2010

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

Самый простой способ - просто рассмотреть Фотографии еще одно свойство, которое нужно вернуть в свой почтовый запрос linq, и создать его с помощью простого подзапроса.

    list = (from portfolio in xmlDoc.Descendants("item")
            select new PortfolioItem()
           {
               Title = portfolio.Element("title").Value,
               Description = portfolio.Element("description").Value,
               Url = portfolio.Element("url").Value,
               Photos = (From P In portfilio.Element("photos").Elements("photo")
                   Select new Photo(P.Attribute("url").Value)
                       {
                           .Thumbnail = bool.Parse(P.Attribute("thumbnail").Value),
                           .Description = P.Attribute("description").Value
                       }).ToList()
           }).ToList();

Хорошая возможность проверитьиз понятия замыканий в LINQ, если вы еще этого не сделали.

0 голосов
/ 22 апреля 2010

Не так быстро, как другие, но опять-таки что-то очень похожее:

Если ваши классы PortfolioItem и Photo выглядят так:

    public class PortfolioItem
    {
        public string Title { get; set; }
        public string Description { get; set; }
        public string Url { get; set; }
        public List<Photo> Photos { get; set; }
    }

    public class Photo
    {
        public string url { get; set; }
        public string thumbnail { get; set; }
        public string description { get; set; }
    }

Затем запросите узел фотографий и заполните список фотографийвот так:

    var list = (from portfolio in xmlDoc.Descendants("item")
     select new PortfolioItem()
           {
                    Title = portfolio.Element("title").Value,
                    Description = portfolio.Element("description").Value,
                    Url = portfolio.Element("url").Value,
                    Photos = portfolio.Elements("photos")
                             .Elements("photo")
                             .Select(p => new Photo {
                              url = p.Attribute("url").Value,
                              thumbnail = p.Attribute("thumbnail").Value,
                              description = p.Attribute("description").Value
                              }).ToList()
                     }).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...