从c#中的xml中取出一些数据

时间:2013-02-18 12:54:17

标签: c# xml treelist

我有一个带有下一个结构的xml:

<main>
   <students>
      <student>
           <name> John </name>
           <phone> 123 </phone>
           <courses>
                  <course>
                       <mark> 5 </mark>
                        <room> 11D </room> 
                        <name> Math </name>
                  </course>
                  <course>
                       <mark> 8 </mark>
                        <room> 12a </room> 
                        <name> Literature </name>
                  </course>
           </courses>
      </student>

      <student>
           <name> Terry </name>
           <phone> 332 </phone>
           <courses>
                  <course>
                       <mark> 9 </mark>
                        <room> 12D </room> 
                        <name> Math </name>
                  </course>
                  <course>
                       <mark> 4 </mark>
                        <room> 2a </room> 
                        <name> Literature </name>
                  </course>
           </courses>
      </student>
   </students>

   <profs>
   ....
   </profs>
</main>

如何以这种格式获取信息:

约翰 - &gt;数学,5;文学,8 特里 - &gt;数学,9;文献,4

我想要做的是创建一个这样的树列表:

约翰   | _ 数学 - 5   | _ 文献 - 8 特里   | _ 数学 - 9   | _ 文献资料 - 4

我管理它以提取学生的名字并将它们作为节点列入树状列表中。

3 个答案:

答案 0 :(得分:2)

看一下XElement类 看看这个example

您可以遍历节点甚至定义linq查询:

        XElement allData = XElement.Load("Authors.xml"); 
        if (allData != null) 
        { 
            IEnumerable<XElement> authors = allData.Descendants("Author"); 
            foreach(XElement author in authors) 
                Console.WriteLine((string)author); 
        }

看看这个example

    string t = "Some title";
    var v = from page in _x.Elements("SitePage")
        where t == page.Element("Title").Value
        select page;

答案 1 :(得分:1)

好的,你想要的本质上是一个包含字符串的字典和另一个包含字符串和列表的字典。

var xml = XElement.Parse("");
var students = xml.Descendants("student");

students.ToDictionary(x => x.Element("name").Value,
    x => x.Descendants("course")
        .ToDictionary(y => y.Element("name").Value,
            y => int.Parse(y.Element("mark").Value)));

这会创建一个Dictionary<string, Dictionary<string, int>>,其中第一个键是学生的名字,第二个是课程名称和标记的字典。

答案 2 :(得分:0)

var allData = XElement.Parse("");
var query = from student in allData.Descendants("student")
            let name = student.Element("name").Value
            select new {
                        StudentName = name , 
                        Courses = 
                                 (from course in student.Descendants("course")
                                  let mark = course.Element("mark").Value
                                  let courseName = course.Element("name").Value
                                  select new { 
                                          CourseName = courseName , 
                                          Mark = mark }
                                  )
                         };    

您可能需要检查空值。 我知道调试不是很容易。

<强> [编辑] allData.Descendants("student") "student"不是大写的foreach (var student in query) { Console.WriteLine(student.StudentName); foreach (var course in student.Courses) { Console.WriteLine(string.Format(" - {0} => {1}", course.CourseName, course.Mark)); } }

测试:

{{1}}