Заполнение доменных объектов из XML с использованием LINQ to XML - PullRequest
1 голос
/ 30 сентября 2010

Я новичок в LINQ to XML и мне нужна помощь в отображении иерархии XML в мой объект домена. Вот источник XML:

<?xml version="1.0" encoding="UTF-8"?>
<Listings>
    <Region>United States</Region>
    <Listing>
        <CatID>ELE</CatID>
        <CatDesc>Electronics</CatDesc>
        <ItemID>ELE_LCDTV</ItemID>
        <ItemDesc>LCD TV BLU RAY</ItemDesc>
        <TotalPrice>1500</TotalPrice>
    </Listing>
    <Listing>
        <CatID>COMP</CatID>
        <CatDesc>Computer</CatDesc>
        <ItemID>COMP_LAPTOP</ItemID>
        <ItemDesc>Laptop HP</ItemDesc>
        <TotalPrice>1200</TotalPrice>
    </Listing>
    <Listing>
        <CatID>MISC</CatID>
        <CatDesc>Miscellaneous</CatDesc>
        <ItemID>MISC_WII</ItemID>
        <ItemDesc>Wii</ItemDesc>
        <TotalPrice>350</TotalPrice>
    </Listing>
    <Listing>
        <CatID>COMP</CatID>
        <CatDesc>Computer</CatDesc>
        <ItemID>COMP_HD</ItemID>
        <ItemDesc>Hard Disk</ItemDesc>
        <TotalPrice>300</TotalPrice>
    </Listing>
    <Listing>
        <CatID>ELE</CatID>
        <CatDesc>Electronics</CatDesc>
        <ItemID>ELE_IPOD</ItemID>
        <ItemDesc>iPod</ItemDesc>
        <TotalPrice>225</TotalPrice>
    </Listing>
    <Listing>
        <CatID>COMP</CatID>
        <CatDesc>Computer</CatDesc>
        <ItemID>COMP_WKEY</ItemID>
        <ItemDesc>Wireless Keyboard</ItemDesc>
        <TotalPrice>110</TotalPrice>
    </Listing>
    <Listing>
        <CatID>MISC</CatID>
        <CatDesc>Miscellaneous</CatDesc>
        <ItemID>MISC_GAME</ItemID>
        <ItemDesc>Games</ItemDesc>
        <TotalPrice>50</TotalPrice>
    </Listing>
</Listings>

Мне нужно заполнить следующие доменные объекты, использующие XML. В основном я должен выставить IEnumerable ListCategories ()

public class Category
{
    public string ID { get; set; }
    public string Description { get; set; }
    public IList<Item> Items { get; set; } 
}

public class Item
{
    public string ID { get; set; }
    public string Description { get; set; }
    public decimal TotalPrice { get; set; }

}

Я понимаю, что сначала должен выполнить запрос orderby, чтобы отсортировать XML по CatID, а затем пройти через него, чтобы заполнить объекты моего домена.

XDocument xDoc = XDocument.Parse(XmlizedString);

var listing = from x in xDoc.Elements("Listings").Elements("Listing")
                                           orderby (string)x.Element("CatID")
                                           select x;

Выше запрос будет сортировать мой XML по CatID, но я не знаю, как действовать дальше ...

Буду очень признателен за ваши предложения / помощь в решении этой проблемы.

Ответы [ 2 ]

3 голосов
/ 30 сентября 2010

Ваш запрос Linq-to-xml будет выглядеть следующим образом.

var listing = 
xDoc.Elements("Listings")
.Elements("Listing")
.GroupBy (x => new { 
                ID = x.Element(XName.Get("CatID")).Value
                , Description = x.Element(XName.Get("CatDesc")).Value
            }
)
.Select (x => new Category { 
                ID = x.Key.ID
                , Description = x.Key.Description
                , Items = x.Select (i => new Item { 
                                    ID = i.Element("ItemID").Value
                                    , Description = i.Element("ItemDesc").Value
                                    , TotalPrice = decimal.Parse(i.Element("TotalPrice").Value) 
                                   }
                    ).ToList()
            }
        )
.OrderBy (x => x.ID);
0 голосов
/ 30 сентября 2010

Я не знаю Linq-to-xml, однако, если приведенный выше запрос проходит через ваш xml и возвращает IEnumerable или аналогичную вещь, вы можете заполнить свои объекты следующим образом:

XDocument xDoc = XDocument.Parse(XmlizedString);

var listing = from x in xDoc.Elements("Listings").Elements("Listing")
              orderby (string)x.Element("CatID")
              select new Category {
                  ID = x.CatID, 
                  Description = x.CatDesc, 
                  Items = new Item { 
                      x.ItemID,  
                      Description = x.ItemDesc, 
                      TotalPrice = x.TotalPrice 
                  } 
              };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...