2013-03-14 1 views
1

У меня есть следующий XMLПолучение XML-элементы в зависимости от конкретного Parent ID LINQ

<Group> 
    <Id>1</Id> 
    <GroupName>Fruit Juices</GroupName> 
    <PersonId>46</PersonId> 
    <DateCreated>0001-01-01T00:00:00</DateCreated> 
    <DateModified>0001-01-01T00:00:00</DateModified> 
    <Products ProductId="24"> 
    <ProductName>Grapes</ProductName> 
    <CategoryId>2</CategoryId> 
    <CategoryName></CategoryName> 
    <SubCategoryId>4</SubCategoryId> 
    <SubCategoryName>Armbands</SubCategoryName> 
    </Products> 
</Group> 
<Group> 
    <Id>2</Id> 
    <GroupName>Wrist Watches</GroupName> 
    <PersonId>49</PersonId> 
    <DateCreated>0001-01-01T00:00:00</DateCreated> 
    <DateModified>0001-01-01T00:00:00</DateModified> 
    <Products ProductId="20"> 
    <ProductName>Hard Drives</ProductName> 
    <CategoryId>2</CategoryId> 
    <CategoryName></CategoryName> 
    <SubCategoryId>4</SubCategoryId> 
    <SubCategoryName>Armbands</SubCategoryName> 
    </Products> 
    <Products ProductId="24"> 
    <ProductName>Grapes</ProductName> 
    <CategoryId>2</CategoryId> 
    <CategoryName></CategoryName> 
    <SubCategoryId>4</SubCategoryId> 
    <SubCategoryName>Armbands</SubCategoryName> 
    </Products> 
    <Products ProductId="34"> 
    <ProductName>Oranges</ProductName> 
    <CategoryId>2</CategoryId> 
    <CategoryName></CategoryName> 
    <SubCategoryId>4</SubCategoryId> 
    <SubCategoryName>Armbands</SubCategoryName> 
    </Products> 
    <Products ProductId="50"> 
    <ProductName>Printers</ProductName> 
    <CategoryId>2</CategoryId> 
    <CategoryName></CategoryName> 
    <SubCategoryId>4</SubCategoryId> 
    <SubCategoryName>Armbands</SubCategoryName> 
    </Products> 
    <Products ProductId="52"> 
    <ProductName>Printers</ProductName> 
    <CategoryId>2</CategoryId> 
    <CategoryName></CategoryName> 
    <SubCategoryId>4</SubCategoryId> 
    <SubCategoryName>Armbands</SubCategoryName> 
    </Products> 
</Group> 

Теперь моя цель состоит в том, чтобы получить все продукты для определенной группы ID.

Я попытался следующие, но это не работает: -

  foreach (XElement xe in xdoc.Descendants("Group")) 
     { 
      Product product = new Product(); 

      Group group = new Group(); 
      group.Id = Convert.ToInt32(xe.Element("Id").Value); 
      group.GroupName = xe.Element("GroupName").Value; 
      group.PersonId = Convert.ToInt32(xe.Element("PersonId").Value); 
      group.DateCreated = Convert.ToDateTime(xe.Element("DateCreated").Value); 
      group.DateModified = Convert.ToDateTime(xe.Element("DateModified").Value); 

      var products = xdoc.Descendants("Groups") 
       .Where(node => (string)node.Attribute("Id") == group.Id.ToString()) 
       .GroupBy(x => x.Value) 
       .Select(x => new { Name = x.Key, Count = x.Count() }) 
       .ToList(); 

      GroupList.Add(group); 
     } 

Как я могу заставить его работать на самом деле получить продукты согласно GroupID?

Спасибо за вашу помощь и время

** * ** * ** * ** * ** * ***UPDATE* ** * ** * ** * ** * ** * ** *

  foreach (XElement xe in xdoc.Descendants("Group")) 
     { 
      var group = from g in xdoc.Descendants("Group") 
         where (int)g.Element("Id") == 1 // filtering groups here 
         select new Group 
         { 
          Id = (int)g.Element("Id"), 
          GroupName = (string)g.Element("GroupName"), 
          PersonId = (int)g.Element("PersonId"), 
          DateCreated = (DateTime)g.Element("DateCreated"), 
          DateModified = (DateTime)g.Element("DateModified"), 
          Products = g.Elements("Products") 
           .Select(p => new Product 
           { 
            Id = (int)p.Attribute("ProductId"), 
            ProductName = (string)p.Element("ProductName") 
           }).ToList() 
         }; 

      foreach (var g in group) 
      { 
       GroupList.Add(g); 
      } 

     } 
+0

Что такое xdoc.Descendants ("Groups")? Вы имеете в виду xdoc.Descendants («Группа»)? – Alex

ответ

1

Используйте литье узлов int, string или DateTime вместо преобразования значения узла:

from g in xdoc.Descendants("Group") 
where (int)g.Element("Id") == id // filtering groups here 
select new Group { 
    Id = (int)g.Element("Id"), 
    GroupName = (string)g.Element("GroupName"), 
    PersonId = (int)g.Element("PersonId"), 
    DateCreated = (DateTime)g.Element("DateCreated"), 
    DateModified = (DateTime)g.Element("DateModified"), 
    Products = g.Elements("Products") 
       .Select(p => new Product {     
        ProductId = (int)p.Attribute("ProductId"), 
        ProductName = (string)p.Element("ProductName"), 
        CategoryName = (string)p.Element("CategoryName"), 
        SubCategoryId = (int)p.Element("SubCategoryId"), 
        SubCategoryName = (string)p.Element("SubCategoryName") 
       }).ToList() 
} 

Также я думаю, что лучше всего объединить все продукты в ваш xml под элементом <Products> с помощью <Product> элементов для каждого продукта.

+1

Да, это работает. Хэнкс Березовский. Почему у вас есть все продукты под 1 элементом? Я думал, что они будут лучше в группах – Johann

+0

Проблема, которую я нахожу с этим, заключается в том, что она возвращает только один продукт, даже если его несколько. Я обновил вопрос с помощью нового кода – Johann

+0

Извините, проигнорируйте мой комментарий Березовский, просто отметил жестко закодированный бит – Johann

Смежные вопросы