如何使用LINQ to xml将多级xml转换为对象

本文关键字:xml 转换 对象 多级 LINQ to 何使用 | 更新日期: 2023-09-27 18:10:27

我的XML文件:

<myobject property1="foo" property2="bar">
    <property3>value1</property3>
    <property3>value1</property3>
    <property3>value1</property3>
</myobject>

我的C#代码:

List<MyObject> myObjectsInDB = (from f in xmlDoc.Descendants("myobject")
             select new MyObject()
             {
                    Property1 = f.Attribute("property1").Value,
                    Property2 = f.Attribute("property2").Value,
                    // Property3 = f.Element("property3").Value,
             }).ToList();

如果您注意到在xml文件中,我有3个元素需要与myobject元素及其属性一起转换为C#类。访问xml内部各个对象的最佳方式是什么。我知道我可能只需要运行一个单独的选择,但我想知道是否有更好的方法来访问它们,这样我就不必对所有内容都运行两次。

如何使用LINQ to xml将多级xml转换为对象

var result = xmlDoc.Descendants("myobject")
                .Select(m => new
                {
                    Property1 = m.Attribute("property1").Value,
                    Property2 = m.Attribute("property2").Value,
                    Property3 = m.Descendants("property3").Select(p3=>p3.Value).ToList()
                })
                .ToList();
var myobjects = 
    from myobjectEl in xdoc.Elements("myobject")
    select new 
    {
        Property1 = myobjectEl.Attribute("property1").Value,
        Property2 = myobjectEl.Attribute("property1").Value,
        Property3Texts = 
            (from prop3El in myobjectEl.Elements("property3") 
            select prop3El.Value).ToList(),
    };

BTW:Descendants("x")返回名称为"x"的所有子元素,Elements("x")返回名称为"x"的所有立即子元素。

假设:MyObject已经被定义为类类型(见下文(。

然后,您可以将xml反序列化为一个对象,如下所示:

public static MyObject deserializeMyObject(){
var xmlString = @"<?xml version=""1.0"" ?><MyObject property1=""foo"" property2=""bar"">
    <property3>value1</property3>
    <property3>value1</property3>
    <property3>value1</property3>
</MyObject>";
var xdoc=XDocument.Parse(xmlString);
XmlSerializer _s = new XmlSerializer(typeof(MyObject));
var foo= (MyObject)_s.Deserialize(xdoc.CreateReader()); 
return foo;
}
//assumption about the structure of your MyObject class
public class MyObject{
 [XmlAttribute("property1")]
public string property1{get;set;}
[XmlAttribute("property2")]
public string property2 {get;set;}
 [XmlElement]
public string[] property3 {get;set;}
}

希望能有所帮助。