2010-11-28 23 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();