2012-06-04 4 views
2

나는 현재 (가독성을 위해 추가 공백 및 타원) 이런 식 XML 파일 형식이C#을 Linq는 XML에 구문 분석 중첩 된 개체 목록

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; } 
} 

Modules 및 DetectLines 목록은 Linq에서 XML로 구문 분석하기 쉽습니다. 그러나 각 DetectLine에 대한 채널 목록을 파싱하는 것은 나에게 분명하지 않습니다. Linq에서 XML로이 작업을 수행 할 수 있습니까? 나는 XMLSerializer를 사용하여 작업을 재구성 할 필요가 없다.

초기 코드 (OPENXML은 OpenFileDialog를이다 이미 좋은 파일 이름을 확인.) :

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

내 추론하면 코드를 사용입니다 me (이것은 정의하고 저장하는 프로그램을위한 설정 파일입니다.이 형식은 읽기/디버그/수동 쓰기가 쉽습니다). 나는 내가 찾고있는 것을 보여주기 위해 현재의 파싱 방법론을 추가했다. 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이 정의되어 있습니다. 이를 위해서는 각 DetectLine에 채널 목록이있는 DetectLines 목록이 필요합니다 (방금 내가 의미하는 바를 설명하기 위해 초기 파싱 메서드가 추가되었습니다). – Bandoth

+0

나는 그것을 어떻게 놓쳤는가? 교훈 : 공복에 코드를 쓰지 마십시오. 대단히 감사합니다! – Bandoth