如何从XML文件中读取嵌套节点

时间:2016-04-19 14:18:43

标签: c# xml winforms

这是我的XML文件通常的样子。它可以包含任意数量的分配和任意数量的模块,并且可以包含3个级别。 (我现在还没有包括其他两个级别。)

<course name="engineering">
    <level4>
        <module name="electric" credit="22">
            <assignment name="wer" marks="22" weight="50">
            </assignment>
            <assignment name="asd" marks="50" weight="50">
            </assignment>
        </module>
    </level4>
</course>

这是我到目前为止所拥有的

while (tr.Read())
{
    tr.MoveToElement();
    if (tr.Name == "Course") {
        courseXML.Name = tr.GetAttribute("name");
    }
    if (tr.Name == "Level4") {

    }
}

我正在阅读XML文件,但我偶然发现了一个问题。如何获取模块元素和赋值元素以及如何遍历它们,因为我的XML文件可以包含任意数量的模块和赋值。

1 个答案:

答案 0 :(得分:1)

如果xml不大,你可以这样做:

    public static List<XmlObject> FindTagsWithChildTags(string xml, string tag,string childTag,string attribute)
    {
        XDocument xdoc = XDocument.Load(xml);
        if (xdoc.Descendants(tag).Any())
        {
            var lv1s = (from lv1 in xdoc.Descendants(tag)
                        select new XmlObject
                        {
                            Element = "",
                            Value = lv1.Attribute(attribute).Value.ToLower(),
                            Field = attribute ,
                            XmlObjects = (from lv2 in lv1.Descendants(childTag)
                                         select new XmlObject
                                         {
                                             Element="",
                                             Field=lv1.FirstAttribute.Name.LocalName,
                                             Value = lv1.FirstAttribute.Value.ToLower()
                                         }).ToList()
                        }).ToList();

            return lv1s;
        }
        return new List<XmlObject>();
    }

如果你有一个非常大的xml,你可以像这样阅读它

    List<Info> infos = new List<Info>();
    XmlReaderSettings settings = new XmlReaderSettings();
    settings.ValidationType = ValidationType.Schema;
   // settings.Schemas.Add("urn:empl-hire", "hireDate.xsd");
    using (System.Xml.XmlReader reader = System.Xml.XmlReader.Create(xmlPath, settings))
    {            
        reader.MoveToContent();
      while(reader.ReadToFollowing("ServiceInformation"))
      {
          string serviceId = reader.GetAttribute("serviceId");
          string serviceUrl = "";
          if (reader.ReadToDescendant("ServiceURL"))
          {
              serviceUrl = reader.ReadElementContentAsString();
          }
          Info info = new Info();
          info.ID = serviceId;
          info.Value1 = serviceUrl;
          infos.Add(info);
      }

    }
    return infos;

这些是我用过的例子,希望他们帮助你!