Silverlight C # LINQ to XML - PullRequest
       5

Silverlight C # LINQ to XML

1 голос
/ 13 октября 2009

Я работаю над веб-приложением Silverlight, которое работает с XML подобно:

<?xml version="1.0" encoding="UTF-8" ?> 
<ProjectList>
    <Type>web</Type> 
    <Project>
        <Id>1</Id> 
        <Name>test web project</Name> 
        <Description>test web project</Description> 
        <ScreenshotList>
            <Screenshot>
                <Path>screen1.jpg</Path> 
                <Description>This a description of screen 1</Description> 
            </Screenshot>
            <Screenshot>
                <Path>screen2.jpg</Path> 
                <Description>This a description of screen 2</Description> 
            </Screenshot>
            <Thumb>noThumb.jpg</Thumb> 
        </ScreenshotList>
    </Project>
</ProjectList>

Я хотел бы создать новый объект для каждого элемента Project в XML. У меня есть класс с именем project, который содержит поля для id, name, description, thumb и список для всех скриншотов.

Мой текущий код LINQ выглядит так:

var projects = from project in xDoc.Root.Elements("Project")
                       select new Project(
                                    Int32.Parse(project.Element("Id").Value, CultureInfo.InvariantCulture),
                                    project.Element("Name").Value,
                                    project.Element("Description").Value,
                                    project.Element("ScreenshotList").Element("Thumb").Value
                                    );

Можно ли в любом случае легко получить скриншоты и добавить их в список в экземпляре Project в рамках этого одного запроса?

РЕДАКТИРОВАТЬ - Добавление конструктора проекта
public Project(int id, string name, string description, string thumbPath)
{
     this.id = id;
     this.name = name;
     this.description = description;
     this.thumbPath = thumbPath;
}

Ответы [ 2 ]

3 голосов
/ 13 октября 2009

Что-то вроде:

    var projects = from project in xDoc.Root.Elements("Project")
                   let list = project.Element("ScreenshotList")
                   select new Project(
                        (int) project.Element("Id"),
                        (string)project.Element("Name"),
                        (string)project.Element("Description"),
                        (string)list.Element("Thumb"),
                        from scr in list.Elements("Screenshot")
                        select new Screenshot(
                            (string)scr.Element("Path"),
                            (string)scr.Element("Description")
                        )
                   );

На основе таких типов, как:

class Project {
    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public string Thumb { get; set; }
    public List<Screenshot> Screenshots { get; private set; }
    public Project( int id, string name, string description, string thumb,
            IEnumerable<Screenshot> screenshots) {
        this.Id = id;
        this.Name = name;
        this.Description = description;
        this.Thumb = thumb;
        this.Screenshots = screenshots == null ? new List<Screenshot>()
                 : new List<Screenshot>(screenshots);
    }
}
class Screenshot {
    public string Path { get; set; }
    public string Description { get; set; }
    public Screenshot(string path,string description) {
        this.Path = path;
        this.Description = description;
    }
}
2 голосов
/ 13 октября 2009

Ну, вы еще не показали, как выглядит конструктор проекта ... он позволяет вам передавать скриншоты как IEnumerable<Screenshot>? Если так, это должно быть легко ... что-то вроде:

var projects = 
    from p in xDoc.Root.Elements("Project")
    select new Project(Int32.Parse(project.Element("Id").Value, 
                                   CultureInfo.InvariantCulture),
                       p.Element("Name").Value,
                       p.Element("Description").Value,
                       p.Element("ScreenshotList")
                        .Element("Thumb").Value,
                       p.Element("ScreenshotList")
                        .Elements("Screenshot")
                        .Select(ss => 
                            new Screenshot(ss.Element("Path").Value,
                                           ss.Element("Description").Value))
                      );

(Я немного переформатировал, чтобы избежать прокрутки.)

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