gpt4 book ai didi

C# - XDocument/linq 到对象

转载 作者:行者123 更新时间:2023-12-02 04:50:36 25 4
gpt4 key购买 nike

如何将 xml 元素导入对象?我下面的代码不起作用,它在 SetValue 处失败,我不知道为什么。

但即便如此,我怀疑 linq 有更简洁的方法来执行此操作,但我找不到任何示例。

class Printers {
public List<Printer> list = new List<Printer>();

public Printers()
{
var xDoc = XDocument.Load(Properties.Settings.Default.XmlSetupPath).Root;
var xPrinters = xDoc.Element("printers").Elements();
foreach (var xPrinter in xPrinters)
{
var printer = new Printer();
foreach (var xEl in xPrinter.Elements())
{
printer.GetType().GetProperty(xEl.Name.ToString()).SetValue(printer, xEl.Value);
}
}

}

}

class Printer
{
public string name;
public string ip;
public string model;
public string infx86;
public string infx64;
public string location;
public string comment;
}

我的 XML:

<printers>
<printer>
<name>my Printer</name>
<ip>192.168.100.100</ip>
<model>Brother</model>
<driver>ab</driver>
<infx86>ab\cd.INF</infx86>
<comment>Copycenter</comment>
</printer>
<printer>
<name>my Printer</name>
<foobar>oh no!</foobar>
</printer>
</printers>

我要

最佳答案

您正在请求属性 - 但您的类型只有字段。要么使它们成为属性,如下所示:

 public string name { get; set; }

... 或使用 Type.GetField相反。

就让它更漂亮而言,我个人会向您的 Printer 类添加一个静态的 FromXElement 方法,此时您可以:

list = xDoc.Element("printers")
.Elements()
.Select(Printer.FromXElement)
.ToList();

或者您可以编写一个通用方法来创建一个新实例并通过反射填充它,例如

public static T FromXElement<T>(XElement element) where T : class, new()
{
T value = new T();
foreach (var subElement in element.Elements())
{
var field = typeof(T).GetField(subElement.Name.LocalName);
field.SetValue(value, (string) subElement);
}
return value;
}

然后:

list = xDoc.Element("printers")
.Elements()
.Select(XmlReflection.FromXElement<Printer>)
.ToList();

关于C# - XDocument/linq 到对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18920435/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com