Linq and xml question

I

Ilyas

Hi all

What I want to do is to be able to create a list of objects given the
following definitions:

public class Department
{
public string Name { get; set; }
public List<Person> Persons { get; set; }
}

public class Person
{
public string Forename { get; set; }
public string Surname { get; set; }
}


from the following xml:

<?xml version="1.0" encoding="utf-8" ?>
<departments>
<department>
<name>Sales</name>
<persons>
<person>
<forename>forename1</forename>
<surname>surname2</surname>
</person>
<person>
<forename>forename2</forename>
<surname>surname2</surname>
</person>
</persons>
</department>
<department>
<name>Accounts</name>
<persons>
<person>
<forename>forename3</forename>
<surname>surname3</surname>
</person>
<person>
<forename>forename4</forename>
<surname>surname4</surname>
</person>
<person>
<forename>forename5</forename>
<surname>surname5</surname>
</person>
</persons>
</department>
<department>
<name>HR</name>
<persons>
<person>
<forename>forename6</forename>
<surname>surname6</surname>
</person>
<person>
<forename>forename7</forename>
<surname>surname7</surname>
</person>
</persons>
</department>
</departments>

I would expect back 3 department objects, and for the first department
I would want 2 person objects?

I have tried the query but caqnt figure out how to include it to fetch
the persons:

XDocument doc = XDocument.Load("Sample.xml);

List<Department> departments = (from d in
doc.Descendants("department")
select new Department
{
Name =
d.Element("name").Value,
Persons =
{

}
}).ToList();

What is the syntax I use to query the person objects for each
department?

Is there a more efficent/easier way to do this?

Many thanks
 
M

Martin Honnen

Ilyas said:
Hi all

What I want to do is to be able to create a list of objects given the
following definitions:

public class Department
{
public string Name { get; set; }
public List<Person> Persons { get; set; }
}

public class Person
{
public string Forename { get; set; }
public string Surname { get; set; }
}


from the following xml:

<?xml version="1.0" encoding="utf-8" ?>
<departments>
<department>
<name>Sales</name>
<persons>
<person>
<forename>forename1</forename>
<surname>surname2</surname>
</person>
<person>
<forename>forename2</forename>
<surname>surname2</surname>
</person>
</persons>
</department>
<department>
<name>Accounts</name>
<persons>
<person>
<forename>forename3</forename>
<surname>surname3</surname>
</person>
<person>
<forename>forename4</forename>
<surname>surname4</surname>
</person>
<person>
<forename>forename5</forename>
<surname>surname5</surname>
</person>
</persons>
</department>
<department>
<name>HR</name>
<persons>
<person>
<forename>forename6</forename>
<surname>surname6</surname>
</person>
<person>
<forename>forename7</forename>
<surname>surname7</surname>
</person>
</persons>
</department>
</departments>

I would expect back 3 department objects, and for the first department
I would want 2 person objects?

XDocument doc = XDocument.Load(@"..\..\XMLFile1.xml");
IEnumerable<Department> departments =
from depEl in doc.Root.Elements("department")
select new Department()
{
Name = depEl.Element("name").Value,
Persons =
(from perEl in
depEl.Element("persons").Elements("person")
select new Person()
{
Forename = perEl.Element("forename").Value,
Surname = perEl.Element("surname").Value
}).ToList()
};

foreach (Department dep in departments)
{
Console.WriteLine("Department {0}:", dep.Name);
foreach (Person per in dep.Persons)
{
Console.WriteLine("\t{0} {1}", per.Forename,
per.Surname);
}
Console.WriteLine();
}
 
I

Ilyas

             XDocument doc = XDocument.Load(@"..\..\XMLFile1.xml");
             IEnumerable<Department> departments =
                 from depEl in doc.Root.Elements("department")
                 select new Department()
                 {
                     Name = depEl.Element("name")..Value,
                     Persons =
                     (from perEl in
depEl.Element("persons").Elements("person")
                      select new Person()
                      {
                          Forename = perEl.Element("forename").Value,
                          Surname = perEl.Element("surname").Value
                      }).ToList()
                 };

             foreach (Department dep in departments)
             {
                 Console.WriteLine("Department {0}:", dep.Name);
                 foreach (Person per in dep.Persons)
                 {
                     Console.WriteLine("\t{0} {1}",per.Forename,
per.Surname);
                 }
                 Console.WriteLine();
             }

--

        Martin Honnen --- MVP XML
       http://JavaScript.FAQTs.com/- Hide quoted text -

- Show quoted text -

Thank yo very much.

That worked
 
Top