2012-05-07 159 views
0

我想用Linq解析XML。用Linq解析XML

这是我的XML数据。

<?xml version="1.0" encoding="utf-8" ?> 
    <people> 
     <person> 
     <firstname>Kate</firstname> 
     <lastname>Smith</lastname> 
     <Address>Address</Address> 
     <Address>Address2</Address> 
     <Address>Address3</Address> 
     <age>27</age> 
     </person> 
     <person> 
     <firstname>Tom</firstname> 
     <lastname>Brown</lastname> 
     <Address>Address4</Address> 
     <Address>Address5</Address> 
     <Address>Address6</Address> 
     <age>30</age> 
     </person> 
     <person> 
     <firstname>Tim</firstname> 
     <lastname>Stone</lastname> 
     <Address>Address7</Address> 
     <Address>Address8</Address> 
     <Address>Address9</Address> 
     <age>36</age> 
     </person> 
     <person> 
     <firstname>Ann</firstname> 
     <lastname>Peterson</lastname> 
     <Address>Address10</Address> 
     <Address>Address11</Address> 
     <Address>Address12</Address> 
     <age>27</age> 
     </person> 
    </people> 

public class XmlParser 
    { 
     List<Person> List = new List<Person>(); 
     public XmlParser() 
     { 
      XDocument loadedData = XDocument.Load("Persons.xml"); 
      var data = (from query in loadedData.Descendants("person") 
       select new Person 
       { 
        FirstName = (string)query.Element("firstname"), 
        LastName = (string)query.Element("lastname"), 
        //Address = (List<string>)query.Element("Address"), // I Want To Load All Address Into My List 
        Age = (int)query.Element("age") 
       }).ToList(); 
      List.AddRange(data); 
     } 

     public class Person 
     { 
      string firstname; 
      string lastname; 
      List<string> address; 
      int age; 

      public string FirstName 
      { 
       get { return firstname; } 
       set { firstname = value; } 
      } 

      public string LastName 
      { 
       get { return lastname; } 
       set { lastname = value; } 
      } 

      public List<string> Address 
      { 
       get { return address; } 
       set { address = value; } 
      } 

      public int Age 
      { 
       get { return age; } 
       set { age = value; } 
      } 

     } 
    } 

任何人都可以帮助我如何在LINQ查询中添加Adrress到列表中。正如你所看到的那样,在人之下有很多地址节点。所以如何将所有地址添加到我的列表对象中。

+0

query.Elements(“Address”)。ToList()? –

+0

什么是清单?你需要正确地考虑你想要的结构。你有没有Person类型?如果您不需要从XML中获取它,但可以对其进行硬编码,那会是什么样子? –

回答

3

获取元素列表的一种方法是在原始linq查询中嵌套另一个linq查询。

var loadedData = XDocument.Load("Persons.xml"); 
var data = (from query in loadedData.Descendants("person") 
      select new Person 
      { 
       FirstName = (string)query.Element("firstname"), 
       LastName = (string)query.Element("lastname"), 
       Address = (from address in query.Elements("Address") 
          select address.Value).ToList(), 
       Age = (int)query.Element("age") 
      }); 

这种模式总是出现在LINQ到XML中,所以我会记住它。