2013-12-10 61 views
0
<?xml version='1.0' encoding='utf-8'?> 
<automationSettings> 

<VM name="DE-123" language="de" powerOn="true"> 
    <vmClients> 
     <vmClient name="KO-123" language="ko"/> 
        <vmClient name="US-123" language="en"/> 
        <vmClient name="FR-123" language="fr"/> 
    </vmClients> 
</VM> 

<VM name="ES-123" language="en" powerOn="true"> 
    <vmClients> 
     <vmClient name="IT-123" language="it"/> 
     <vmClient name="JA-123" language="ja"/> 
    </vmClients> 
</VM> 

</automationSettings> 

我有一個C#方法,當VM元素具有匹配的名稱時,應該返回所有vmClient名稱屬性的值。例如,我想獲取名爲「DE-123」的虛擬機的vmClient名稱。這是我試過的代碼,但它沒有返回任何東西。我究竟做錯了什麼?感謝您提供的任何幫助。使用LINQ返回所有匹配的XML節點

public static void GetClientsList(string systemName) 
    { 
     systemsFilePath = "text.xml"; 
     string listOfClients = string.Empty; 

     try 
     { 
      var xdoc = XDocument.Load(systemsFilePath); 
      var query = from vm in xdoc.Root.Descendants("VM").Descendants("vmClients").Elements() 
         where vm.Attribute("name").Value == systemName 
         select new 
         { 
          Name = (string)vm.Attribute("name").Value 
         }; 

      var vms = query.ToList(); 

      for (int i = 0; i < vms.Count; i++) 
      { 
       listOfClients += vms[i].Name + " "; 
      } 

      Global.epoClients = listOfClients; 
     } 

     catch (Exception ex) 
     { 
      Console.WriteLine("GetClientsList exception: " + ex.Message); 
     } 
    } 
} 
+0

您目前正在測試'vmClients'元素中的'name'屬性 - 但'name'屬性僅在'vmClient'(單數)或'VM'上。 –

回答

1

我懷疑你真正想要的:

var query = xdoc.Root.Descendants("VM") 
       .Where(vm => (string) vm.Attribute("name") == systemName) 
       .Descendants("vmClient") 
       .Select(vmClient => (string) vmClient.Attribute("name")); 

注意我們如何測試​​元素,而不是vmClients元素。

+0

你的懷疑是正確的。這工作完美。非常感謝您的及時答覆。 J. – bearaman