2012-11-27 142 views
0

解析XML我有一个XML文件是这样的:使用C#和Windows Phone 7

<xml> 
    <students> 
     <person name=jhon/> 
     <person name=jack/> 
     ... 
    </students> 
    <teachers> 
     <person name="jane" /> 
     <person name="jane" /> 
     ... 
    </teachers> 
    </xml> 

如果我用这个代码:

var xml = XDocument.Parse(myxmlstring, LoadOptions.None); 
foreach(XElement studentelement in xml.Descendants("person")) 
{ 
    MessageBox.Show(studentelement.Attribute("name").Value); 
} 

一切正常!但是,我不知道我是否在迭代学生或老师。

但是当我尝试:

var a = xml.Element("students"); 

一个为空!

如何在c#中选择xml文档中的特定元素?

如果我只能先对学生进行迭代,填写一些列表框并对教师进行迭代并执行其他操作,那将会非常棒。 :)

的xml文件不能老是被修改,以防万一......

最后,所有其实我是想用这一切的是获取特定元素的所有孩子在我的文件。

谢谢大家!

回答

1

Element只返回直接子节点。要递归浏览xml树,请改为使用Descendants

依次列举学生那么老师,你可以这样做:

var xml = XDocument.Parse(myxmlstring, LoadOptions.None); 

var students = xml.Descendants("students"); 
var teachers = xml.Descendants("teachers"); 

foreach (var studentElement in students.Descendants("person")) 
{ 
    MessageBox.Show(studentElement.Attribute("name").Value); 
} 

foreach (var teacherElement in teachers.Descendants("person")) 
{ 
    MessageBox.Show(teacherElement.Attribute("name").Value); 
} 
4

但是,当我尝试:var a = xml.Element(“students”);

a为空!

是的,因为xml是文档,而且也只有一个以下直接元素 - 所谓xml。如果你使用:

var students = xml.Root.Element("students"); 

相反,它会寻找<students>直接根元素之下,而是和它的工作。

或者,你可以使用两次Element

var students = xml.Element("xml").Element("students"); 

或者使用Descendants,当然。

此外,你可以得到与Parent性的元素的父元素...因此,如果你想遍历所有person元素,并且使用的父元素的名称出于某种原因,你当然可以这样做。