使用 LINQ 读取 XML 文件并使用 IEnumerable propety 创建对象
本文关键字:IEnumerable propety 创建对象 LINQ 读取 XML 文件 使用 | 更新日期: 2023-09-27 18:36:15
这是我的问题:
我有这个 XML 文件:
<?xml version="1.0" encoding="utf-8" ?>
<settings>
<app name="Application1">
<log name="Log1" path="d:'paths'" filename="Log1File"/>
<log name="Log2" path="d:'paths'"/>
<log name="log3" path="d:'paths'" filename="Log3File"/>
</app>
</settings>
我正在尝试使用 LINQ 读取它并创建此类的对象:
public class Apps
{
public string Name { get; set; }
public IEnumerable<Logs> Logs { get; set; }
}
public class Logs
{
public string Name { get; set; }
public string Path { get; set; }
public string Filename { get; set; }
}
到目前为止,我设法创建了这段代码,但是看起来它只获得了第一个日志元素的平均时间,我需要每个应用程序元素的所有日志元素:
public static IEnumerable<Apps> GetAllApps()
{
var items = from a in db.Descendants("app")
orderby a.Attribute("name").Value
select new Apps
{
Name = a.Attribute("name").Value,
Logs = from b in a.Descendants("log")
select new Logs
{
Name = b.Attribute("name").Value,
Path = b.Attribute("path").Value,
Filename = b.Attribute("filename").Value
}
};
return items;
}
我会在这里使用序列化
XmlSerializer ser = new XmlSerializer(typeof(Settings));
var result = (Settings)ser.Deserialize(stream);
[XmlRoot("settings")]
public class Settings
{
[XmlElement("app")]
public Apps[] apps;
}
public class Apps
{
[XmlAttribute("name")]
public string Name { get; set; }
[XmlElement("log")]
public Logs[] Logs { get; set; }
}
public class Logs
{
[XmlAttribute("name")]
public string Name { get; set; }
[XmlAttribute("path")]
public string Path { get; set; }
[XmlAttribute("filename")]
public string Filename { get; set; }
}
我使用了流畅的API,但让你根据自己的喜好进行调整......
问题是 NullReferenceException,因为 xml 中的某个日志没有"文件名"属性。当您在空值上使用"值"时,您将获得 NRE。
因此,在尝试获取其值之前,请检查属性是否存在。
var it = db.Descendants("app")
.OrderBy(app => app.Attribute("name").Value)
.Select(app => new Apps() {
Name = app.Attribute("name").Value,
Logs = app.Descendants("log").Select(a =>
new Logs() {
Name = a.Attribute("name") != null ? a.Attribute("name").Value : null,
Path = a.Attribute("path") != null ? a.Attribute("path").Value : null,
Filename = a.Attribute("filename") != null ? a.Attribute("filename").Value : null
}).ToList()
}).ToList();