2014-04-29 63 views
1

我試圖用linq從XML文件中獲取數據,並將它們轉換爲對象。測試XML屬性的值來創建一個對象

但有些我在我的XML文件中的數據是這樣的:

​​3210

我想要做的是創造機器AAA,BBB,CCC和DDD。

目前,我的代碼是:

Data DataMachines= new Data 
{ 
    Machines = (from _alias in XEle.Elements("Machines").Elements("Alias") 
       where _alias.Attribute("name").Valeur.Contains("MACHINE_") 
       select new Machine 
       { 
        Name=(string)_alias.Attribute("name").Value    
       }).ToList() 
}; 

用這種方法我會盡可能多的「機器」,因爲是「別名」在我的XML文件中。

有沒有一種方法來創建一個單一實例的對象「機器」,根據之前的第二字符「_」的

此代碼的目的是創建: 的實例「Machine_AAA」具有通道1,2,3, 的實例「Machine_BBB」具有通道1,2,3, 的實例「Machine_CCC」與通道1 ,2, 帶有通道1的實例「Machine_DDD」。

對不起,如果不清楚,英語是我的第二語言,C#是我的第三語言。

謝謝你的回答。

+0

您是否可以控制正在讀取的xml文件? – DaveParsons

+0

我無法更改xml文件。 :( – MiL

回答

0

關鍵是要使用下劃線將name屬性的值分組,然後將第二個元素(即機器名稱)分組。這裏是一個代碼示例,它只是這樣做的:

const string machinesXml = @"<XMLFILE> 
    <Machines> 
     <Alias name=""MACHINE_AAA_1"" /> 
     <Alias name=""MACHINE_AAA_2"" /> 
     <Alias name=""MACHINE_AAA_3"" /> 
     <Alias name=""MACHINE_BBB_1"" /> 
     <Alias name=""MACHINE_BBB_2"" /> 
     <Alias name=""MACHINE_BBB_3"" /> 
     <Alias name=""MACHINE_CCC_1"" /> 
     <Alias name=""MACHINE_CCC_2"" /> 
     <Alias name=""MACHINE_DDD_1"" /> 
    </Machines> 
</XMLFILE>"; 

var XEle = XElement.Parse(machinesXml); 

// Locate the machines element 
var machinesElement = XEle.Element("Machines"); 

// Split the name 
var splitAliasNames = machinesElement.Elements("Alias").Select(a => a.Attribute("name").Value.Split('_')); 

// Only take those where the split elements are what we expect 
var ofCorrectParts = splitAliasNames.Where(split => split.Length == 3 && 
             "MACHINE".Equals(split[0], StringComparison.OrdinalIgnoreCase)); 

var channelForMachine = ofCorrectParts.Select(split => new 
{ 
    MachineName = split[1], 
    ChannelName = split[2] 
}); 

var byMachineName = channelForMachine.GroupBy(s => s.MachineName, StringComparer.OrdinalIgnoreCase); 
var machines = byMachineName.Select(g => 
    { 
     var channels = g.Select(s => s.ChannelName).ToList(); 
     return new Machine 
     { 
      Name = g.Key, 
      Channels = channels 
     }; 
    }); 

foreach (var machine in machines) 
{ 
    Console.WriteLine("Machine '{0}':", machine.Name); 
    foreach (var channel in machine.Channels) 
    { 
     Console.WriteLine("\tChannel '{0}'", channel); 
    } 
} 
Console.ReadKey(true); 
+0

嗨,對不起,我遲到了。最後我做了這個喜歡你的。謝謝你的回答! – MiL

+0

嗨@tazinoufou如果這個或任何答案已經解決了你的問題,請考慮[接受它](http:// meta .stackexchange.com/q/5234/179419),這表明您已經找到了解決方案,併爲答覆者和您自己提供了一些聲譽,但沒有義務這麼做。 – Lukazoid

+0

好的!我做到了,謝謝。 – MiL

相關問題