给定一个Xml文档,您将如何填充属性和元素的路径列表

时间:2014-11-07 12:30:53

标签: c# xml

给出以下Xml:

<Student number='2020'>
  <Subject>Comp</Subject>
  <Credintials>
    <Password>010101</Password>
    <PasswordLength>6</PasswordLength>
    <Contact>contact@example.com</Contact>
  </Credintials>
  <PersonalDetails age='30' height='2'/>
  <Lecture age='30' height='2'>
    <StudentName>Hakeem</StudentName>
  </Lecture>
</Student>

我想打印出以下列表:

Student.@number=2020
Student.Subject=Comp
Student.Credintials.Password=010101
Student.Credintials.PasswordLength=6
Student.Credintials.Contact=contact@example.com
Student.PersonalDetails.@age=30
Student.Lecture.@age=30
Student.PersonalDetails.@height=2
Student.Lecture.@height=2
Student.Lecture.StudentName=Hakeem

我基本上试图为属性和元素获取这些路径,这些属性和元素的值等于innerText,如StudentName,Password,Subject等元素。喜欢年龄,身高等等。

由于

1 个答案:

答案 0 :(得分:0)

这样的方法将打印出您期望的内容

var xml  = @"<Student number='2020'>
                          <Subject>Comp</Subject>
                          <Credintials>
                            <Password>010101</Password>
                            <PasswordLength>6</PasswordLength>
                            <Contact>contact@example.com</Contact>
                          </Credintials>
                          <PersonalDetails age='30' height='2'/>
                          <Lecture age='30' height='2'>
                            <StudentName>Hakeem</StudentName>
                          </Lecture>
                        </Student>";

var xmlParsed = XElement.Parse(xml);
GetNodeDescendantsAndPrint(xmlParsed);


public void GetNodeDescendantsAndPrint(XElement node, string nameToAppend= null)
{
    var name = string.IsNullOrEmpty(nameToAppend) 
                        ? node.Name.LocalName  
                        : nameToAppend;
    foreach (var att in node.Attributes())
    {
        Console.WriteLine(name + ".@" + att.Name.LocalName + "=" + att.Value);
    }
    var descendants = node.Elements();
    if (descendants.Any())
    {
        foreach (var innerNode in descendants.OfType<XElement>())
        {
            GetNodeDescendantsAndPrint(innerNode, 
                                        name+"." + innerNode.Name.LocalName );
        }
    }
    else
    {
            Console.WriteLine(name + "=" + node.Value);
    }

}