2013-04-22 125 views
1

我的XML文件:如何使用LINQ to XML將多級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文件中注意到我有需要與MyObject的元素和它一起被轉換成C#類3元屬性。訪問xml中的單個對象的最佳方式是什麼?我知道我可能只是運行一個單獨的選擇,但我想知道是否有更好的方式來訪問它們,所以我不必一次遍歷所有內容。

回答

3
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(); 
1
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」。

0

假設: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;} 
} 

希望它能幫助。

+0

使用XmlSerializer時性能如何? – al2suarez 2016-09-29 18:14:55