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