2010-11-28 37 views
0

我有两个列表的XML文件,形成亲子关系,是这样的:的LINQ to XML查询加盟亲子列出

<Categories>
<Category id="10000">Category 1</Category>
<Category id="10100">Category 2</Category>
<Category id="10101">Category 3</Category> ...
</Categories>

<Actions>
<Action name="Action 1"><Categories><Category id="10100"/><Category id="10102"/></Categories></Action>
<Action name="Action 2"><Categories><Category id="10101"/><Category id="10103"/></Categories></Action>
...
</Actions>

每个Action主列表中至少有一个类别。 我想我的查询,扩大与来自上级类别列表他们的名字每一个动作类,所以输出结构将是这样的:

类行动{
公共字符串ActionName;
public list <Category>分类;
}

class分类{
public string CategoryName;
public int CategoryId;
}

我完全失去了,请帮忙。

回答

0

您可以先创建一个List来存储独特的Category对象,然后您可以在创建Action对象时参考该对象。 实例C#代码:

XDocument doc = XDocument.Load(@"..\..\XMLFile1.xml"); 
    List<Category> referencedCategories = 
     (from cat in doc.Root.Element("Categories").Elements("Category") 
     where doc.Root.Element("Actions").Elements("Action").Elements("Categories").Elements("Category").Any(c2 => cat.Attribute("id").Value == c2.Attribute("id").Value) 
     select new Category() 
     { 
      CategoryId = (int)cat.Attribute("id"), 
      CategoryName = (string)cat 
     }).ToList(); 

    List<Action> actions = 
     (from action in doc.Root.Element("Actions").Elements("Action") 
     select new Action() 
     { 
      ActionName = (string)action.Attribute("name"), 
      Categories = (from cat in referencedCategories 
          where action.Element("Categories").Elements("Category").Any(cat2 => (int)cat2.Attribute("id") == cat.CategoryId) 
          select cat).ToList() 
     }).ToList(); 

    foreach (Action action in actions) 
    { 
     Console.WriteLine("Action {0}:", action.ActionName); 
     foreach (Category cat in action.Categories) 
     { 
      Console.WriteLine("\tId: {0}; Name: {1}", cat.CategoryId, cat.CategoryName); 
     } 
     Console.WriteLine(); 
    } 

随着XML样本是

<Root> 
    <Categories> 
    <Category id="10000">Category 1</Category> 
    <Category id="10100">Category 2</Category> 
    <Category id="10101">Category 3</Category> 
    <Category id="10102">Category 4</Category> 
    <Category id="10103">Category 5</Category> 
    </Categories> 

    <Actions> 
    <Action name="Action 1"> 
     <Categories> 
     <Category id="10100"/> 
     <Category id="10102"/> 
     </Categories> 
    </Action> 
    <Action name="Action 2"> 
     <Categories> 
     <Category id="10101"/> 
     <Category id="10103"/> 
     </Categories> 
    </Action> 
    </Actions> 

</Root> 

该样本输出

Action Action 1: 
     Id: 10100; Name: Category 2 
     Id: 10102; Name: Category 4 

Action Action 2: 
     Id: 10101; Name: Category 3 
     Id: 10103; Name: Category 5 

如果你喜欢使用join子句中的代码可作如下修改:

XDocument doc = XDocument.Load(@"..\..\XMLFile1.xml"); 
    List<Category> referencedCategories = 
     (from cat in doc.Root.Element("Categories").Elements("Category") 
     join cat2 in doc.Root.Element("Actions").Elements("Action").Elements("Categories").Elements("Category") on cat.Attribute("id").Value equals cat2.Attribute("id").Value 
     select new Category() 
     { 
      CategoryId = (int)cat.Attribute("id"), 
      CategoryName = (string)cat 
     }).ToList(); 

    List<Action> actions = 
     (from action in doc.Root.Element("Actions").Elements("Action") 
     select new Action() 
     { 
      ActionName = (string)action.Attribute("name"), 
      Categories = (from cat in referencedCategories 
          join cat2 in action.Element("Categories").Elements("Category") on cat.CategoryId equals (int)cat2.Attribute("id") 
          select cat).ToList() 
     }).ToList();