2012-06-04 2 views
2

Я в настоящее время имеют формат файла XML, который выходит что-то вроде этого (пропуски и эллипсы добавляемые для удобства чтения):C# Linq для 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; } 
} 

Список модулей и 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

Вещь есть несколько DetectLines, определенных в файле XML. Это требует от меня создания списка DetectLines, где каждый отдельный DetectLine имеет список каналов (просто добавил мой первоначальный метод синтаксического анализа, чтобы объяснить, что я имею в виду). – Bandoth

+0

Как я пропустил это? Извлеченный урок: никогда не закодируйте натощак. Большое спасибо, сэр! – Bandoth

 Смежные вопросы

  • Нет связанных вопросов^_^