Linq-XML всегда такой грязный? - PullRequest
6 голосов
/ 29 января 2010
var subset = from item in document.Descendants("Id")
             where item.Value == itemId.ToString()
             select new PurchaseItem() {
                 Id = int.Parse(item.Parent.Element("Id").Value),
                 Name = item.Parent.Element("Name").Value,
                 Description = item.Parent.Element("Description").Value,
                 Price = int.Parse(item.Parent.Element("Price").Value)
             };

Структура XML выглядит следующим образом:

<Items>
    <Item>
        <Id></Id>
        <Name></Name>
        <Description></Description>
        <Price></Price>
    </Item>
</Items>

Id и цена являются целочисленными значениями. Имя и описание являются строками.

Я нашел Linq to XML отлично подходит для того, для чего я его использовал, это всего лишь фрагмент. Но, с другой стороны, я чувствую, что он должен или мог бы быть чище. Кастинг кажется наиболее очевидной проблемой в этом фрагменте.

Любой совет?

Ответы [ 4 ]

13 голосов
/ 29 января 2010

На самом деле было бы лучше разыграть ИМО, чем звонить int.Parse. Вот как бы я написал ваш запрос:

string id = itemId.ToString(); // We don't need to convert it each time!

var subset = from item in document.Descendants("Id")
             where item.Value == id
             let parent = item.Parent
             select new PurchaseItem
             {
                 Id = (int) parent.Element("Id"),
                 Name = (string) parent.Element("Name"),
                 Description = (string) parent.Element("Description"),
                 Price = (int) parent.Element("Price")
             };
1 голос
/ 29 января 2010

Попробуйте написать новый конструктор для PurchaseItem, который принимает элемент XML, поэтому вы можете написать:

select new PurchaseItem(item.Parent);
1 голос
/ 29 января 2010

В вашем примере вы можете немного привести в порядок, найдя элемент <Item/> вместо <Id/>, чтобы избежать получения Parent каждый раз:

var subset = from item in document.Descendants("Item")
             where item.Element("Id").Value == itemId.ToString()
             select new PurchaseItem()
                        {
                            Id = int.Parse(item.Element("Id").Value),
                            Name = item.Element("Name").Value,
                            Description = item.Element("Description").Value,
                            Price = int.Parse(item.Element("Price").Value)
                        };
1 голос
/ 29 января 2010

Я предполагаю, что у вас есть узел "Items"?

Вы можете сделать что-то вроде этого, предполагая, что вы загружаете документ с помощью XElement.Load ()

var subset = from item in document.Elements("Item")
             where item.Element("Id").Value == itemId.ToString()
             select new PurchaseItem() {
                 Id = int.Parse(item.Element("Id").Value),
                 Name = item.Element("Name").Value,
                 Description = item.Element("Description").Value,
                 Price = int.Parse(item.Element("Price").Value)
             };

Не намного лучше, но намного легче читать!

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