[英]C# - XDocument / linq to object
How can i import xml elements to object? 如何将xml元素导入对象? My code below doesn't work, it fails at the SetValue and i can't figure out why.
我下面的代码不起作用,它在SetValue处失败,我不知道为什么。
But even then, i suspect that linq has a much cleaner way of doing this but i can't find any examples. 但是即使那样,我怀疑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;
}
my XML: 我的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>
I want to 我想要
You're asking for properties - but your type only has fields . 您要的是属性 -但您的类型仅包含字段 。 Either make them properties, like this:
使它们成为属性,如下所示:
public string name { get; set; }
... or use Type.GetField
instead. ...或改用
Type.GetField
。
In terms of making it prettier, I'd personally add a static FromXElement
method to your Printer
class, at which point you could have: 为了使其更
FromXElement
,我个人将静态FromXElement
方法添加到Printer
类,此时您可以:
list = xDoc.Element("printers")
.Elements()
.Select(Printer.FromXElement)
.ToList();
Or you could write a generic method to create a new instance and populate it via reflection, eg 或者,您可以编写一个通用方法来创建一个新实例并通过反射将其填充,例如
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;
}
Then: 然后:
list = xDoc.Element("printers")
.Elements()
.Select(XmlReflection.FromXElement<Printer>)
.ToList();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.