2012-12-16 12 views
3

我有一個probleme解析多個XML領域解析XML使用LINQ與多個後代

這是一個對XML的風格:

<students> 
    <student> 
    <student_id>1</student_id> 
    <student_name>Mike</student_name> 
    <subjects> 
     <subject> 
     <school_subject>History</school_subject> 
     </subject> 
     <subject> 
     <school_subject>Maths</school_subject> 
     </subject> 
     <subject> 
     <school_subject>English</school_subject> 
     </subject> 
    </subjects> 
    </student> 
    <student> 
    ... 
    </student> 
</students> 

我可以分析它像student_id數據和student_name簡單場但是當有多個重複的同一個字段時,我不知道該怎麼做:/ 這是我解析的源代碼。

我做了兩個類:

  • 含學校者姓名主題
  • 學生包含ID和名稱和類主題的列表。

現在的源代碼:

List<Student> L1 = new List<Student>(); 

XDocument doc = XDocument.Load(s); 
var q = from b in doc.Descendants("student") 
select new 
{ 
    s_id = (string)b.Element("student_id"), 
    s_name = (string)b.Element("student_name"), 
    s_subject = (Subject)b.Elements("school_subject") 
}; 
foreach (var p in q) 
{ 
    L1.Add(new Student() { id = p.s_id, name = p.s_name, subject = p.s_subject }); 
} 
listBox1.ItemsSource = L1; 

感謝您的閱讀和對不起我非常糟糕的英語。

回答

5

一個list根據您的XML學生可以有多個科目。所以,你需要作爲學生的財產收集科目:

public class Student 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public List<Subject> Subjects { get; set; } 
} 

public class Subject 
{ 
    public string Name { get; set; } 
} 

這裏是解析。爲了填補GET學生的科目,你需要做的子查詢:

XDocument xdoc = XDocument.Load(s); 
IEnumerable<Student> students = 
    from s in xdoc.Descendants("student") 
    select new Student() 
    { 
     Id = (int)s.Element("student_id"), // you can cast to int 
     Name = (string)s.Element("student_name"), 
     Subjects = s.Element("subjects") // here goes sub query 
        .Elements("subject") 
        .Select(subj => new Subject() { 
         Name = (string)subj.Element("school_subject") 
        }).ToList() 
    }; 

BTW,我認爲你可以用簡單的字符串來保存主題名稱 - 你並不真正需要的類爲該。

0

因爲你必須在XML多學科s_subject應該是Subject

doc.Elements("Student").Select(
x=> 
    s_id = (string)x.Element("student_id"), 
    s_name = (string)x.Element("student_name"), 
    s_subject = x.Element("subjects").Elements("subject") 
       .Select(s=>s.Element("school_subject").Value) 
       .ToList<Subject>() 
);