2012-06-04 47 views
2

我現在有一個是這樣的(空白和橢圓增加了可讀性)一個XML文件格式:C#的LINQ to XML - 解析嵌套的對象列表

<root> 
    <Module>   //Start with list of Modules 
     <ModuleParams> 
     </ModuleParams> 
    </Module> 
    ... 

    <DetectLine>  //Now a list of DetectLines 
     <DetectLineParams> 
     </DetectLineParams> 

     <Channels> //List of Channels embedded in each DetectLine 
      <Channel> 
       <ChannelParams> 
       </ChannelParams> 
      </Channel> 
      ... 

     </Channels> 
    </DetectLine> 
    ... 

</root> 

類結構如下:

public class Module 
{ 
    public ModuleParams { get; set; } 
} 

public class DetectLine 
{ 
    public DetectLineParams { get; set; } 
    public List<Channel> Channels { get; set; } 
} 

public class Channel 
{ 
    public ChannelParams { get; set; } 
} 

模塊和檢測線列表很容易用Linq解析XML。但是,解析每個DetectLine的頻道列表對我來說並不那麼明顯。這甚至可以用Linq到XML來完成嗎?我寧願不必重構結構以使用XMLSerializer。

初始代碼(OpenXML的一個打開文件對話框已經簽好名。):

List<Module> myModules; 
List<DetectLine> myDetectLines; 
XDocument config = XDocument.Load(openXML.FileName); 

myModules = 
     (from myElements in config.Descendants("Module") 
      select new Module() 
      { 
       ModuleParam1 = (string)myElements.Element("ModuleParam1"), 
       ModuleParam2 = (string)myElements.Element("ModuleParam2"), 
       ... 
      }).ToList<Module>(); 

myDetectLines = 
      (from myElements in config.Descendants("DetectLine") 
      select new DetectLine() 
      { 
       DetectLineParam1 = (string)myElements.Element("ModuleParam1"), 
       DetectLineParam2 = (string)myElements.Element("ModuleParam2"), 
       ... 

       // ?? Add Channels list here somehow... 
      }).ToList<DetectLine>(); 
+0

給使用你的模塊和DetectLines – MarcinJuraszek

+0

我的理由代碼保持類,所以一般是因爲實際參數均達到我(這是我定義和保存的程序的配置文件,這種格式使得手動讀取/調試/寫入變得容易)。我已經添加了我當前的解析方法來顯示我在找什麼。我不需要有人自己解決XML或類,只是建議使用Linq查詢進行解析。 – Bandoth

回答

2

隨着

XElement detectLine = XElement.Parse(@"<DetectLine>  
     <DetectLineParams> 
     </DetectLineParams> 

     <Channels>  
      <Channel> 
       <ChannelParams> 
       </ChannelParams> 
      </Channel> 
      ... 

     </Channels> 
    </DetectLine> 
"); 

,你可以做如

DetectLine dl1 = new DetectLine() { 
    DetectLineParams = ..., 
    Channels = (from channel in detectLine.Element("Channels").Element("Channel") 
      select new Channel() { 
       ChannelParams = new ChannelParams() { ... = channel.Element("ChannelParams").Value } 
      }).ToList(); 

我們確實需要看到更多具體的C#類代碼來說明如何設置完整查詢。

[編輯] 以配合你現在已經發布的代碼:

myDetectLines = 
      (from myElements in config.Descendants("DetectLine") 
      select new DetectLine() 
      { 
       DetectLineParam1 = (string)myElements.Element("ModuleParam1"), 
       DetectLineParam2 = (string)myElements.Element("ModuleParam2"), 
       ... 

       Channels = (from channel in myElements.Element("Channels").Element("Channel") 
       select new Channel() { 
        ChannelParams = new ChannelParams() { ... = channel.Element("ChannelParams").Value } 
       }).ToList(); 
      }).ToList<DetectLine>(); 
+0

在XML文件中定義了多個DetectLines。這需要我創建一個DetectLines列表,其中每個單獨的DetectLine都有一個Channels列表(只是添加了我的初始解析方法來解釋我的意思)。 – Bandoth

+0

我怎麼錯過了?獲得的經驗:從不空腹編碼。非常感謝主席先生! – Bandoth