Вопрос для новичков по XML Linq

Я работаю с XML-файлом, который выглядит примерно так:

<lfm status="ok">
    <user>
       <name>JohnnyWestlake</name>
       <image size="large">http://someurl.com/large.jpg</image>
       <image size="extralarge">ttp://someurl.com/exlarge.jpg</image>
       ...
    </user>
</lfm>

И я добавляю это в класс пользователя, используя Linq, вот так:

        User user;

        user = (from lfmUser in userrequest.Descendants("user")
               select new User
               {
                   Name = lfmUser.Element("name").Value,
                   ImageM = lfmUser.Element("image").Value,
                   ...
               }).FirstOrDefault();

Вопрос, как я могу установить ImageM для URL-адреса, содержащегося в image size = "extralarge", а не image size = "large"? Или я должен пойти другим путем?


person Johnny Westlake    schedule 30.07.2010    source источник


Ответы (2)


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

var user = (from lfmUser in userrequest.Descendants("user")
    select new User
    {
        Name = lfmUser.Element("name").Value,
        ImageM = lfmUser.Descendants("image").Where(x=>x.Attribute("size").Value == "large").First().Value
    }).FirstOrDefault();
person Rob    schedule 30.07.2010

person    schedule
comment
Я проголосовал за ваше решение, даже если лучше использовать firstordefault вместо first () - person frabiacca; 31.07.2010
comment
@frabiacca Я действительно удалил его, но «лучше» зависит от ситуации. Если вам ТРЕБУЕТСЯ значение для того, что у вас «Первое», то использование FirstOrDefault может быть не лучше, возможно, вы предпочтете исключение. NuclearWinter nw = новый ABomb (accessCode.FirstOrDefault ()) .Detonate (); // что происходит сейчас?? - person µBio; 31.07.2010
comment
@Lucas: я написал «лучше», потому что я подумал, что если мне нужно извлечь какой-то текст из моего xml, я ожидаю чего-то в выводе. Если вы используете First (), это вызовет исключение InvalidOperationException, если последовательность не содержит никакого значения. - person frabiacca; 31.07.2010
comment
Спасибо обоим за ваши ответы, работает как шарм, очень признателен =) - person Johnny Westlake; 31.07.2010
comment
@frabiacca Правильно. Я говорю, что исключение - это именно то, что вы иногда хотите, а получение Default (T) - это то, что вам нужно в других случаях. Ни то, ни другое не всегда лучше, программист должен решать, исходя из ситуации. :) - person µBio; 31.07.2010
comment
Чтобы сделать это лучше, нужно использовать оператор явного преобразования вместо .Value (hanselman. ru / blog /) - person Necros; 31.07.2010