C# Linq to XML - 分析嵌套对象列表

本文关键字:嵌套 对象 列表 Linq to XML | 更新日期: 2023-09-27 18:36:10

我目前有一个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 to XML进行解析。 但是,解析每个侦探线的频道列表对我来说并不那么明显。 这甚至可以用Linq to 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>();

C# Linq to XML - 分析嵌套对象列表

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>();