在C#中使用XML阅读器获取嵌套值

时间:2017-11-23 11:42:20

标签: c# xml xmlreader

我有一个问题,我想在我的XML文件中获取嵌套元素的值。

-<Modules>
 -<Modules4>
   -<Module>
       <Name>dasd</Name>
       <Code>dasdasdas</Code>
       <Credits>40</Credits>
    </Module>
   -<Module>
     <Name>dasdasd</Name>
     <Code>dasdasd</Code>
     <Credits>40</Credits>
   </Module>
</Modules4>

 <Modules5/>

 <Modules6/>

 </Modules>

这是XML文件,我试图创建一个条件,如果读者找到“Modules4”元素,然后获得嵌套元素“名称”,“代码”和“信用”,如果这个问题已被回答,请指导我,因为我无法在任何地方找到它。

    using (XmlReader reader = XmlReader.Create("SavedData.xml"))
            while (reader.Read())
        {
                if (reader.IsStartElement())
                {
                    if (reader.Name == "Modules4"){

                    switch (reader.Name)
                    {
                        case "Name":
                            string name = reader.ReadString();
                            Console.WriteLine(name);
                            break;

                        case "Code":
                            string Code = reader.ReadString();
                            Console.WriteLine(Code);
                            break;

                        case "Credits":

                            break;


                    }
                }
            }
        }
    }

这是我的代码。

感谢。

2 个答案:

答案 0 :(得分:0)

您当前代码存在的问题是switch仅在reader.Name "Modules4"时才会到达,而不是其中一个孩子。

如果我是你,我会使用ReadSubtree()方法:

...
if (reader.IsStartElement())
{
    if (reader.Name == "Modules4") 
    {
        ReadModules4(reader.ReadSubtree());
    }
}
...

然后您可以使用单独的方法处理子树:

void ReadModules4(XmlReader reader)
{
    while (reader.Read())
    {
        switch (reader.Name)
        {
            ...
        }
    }
}

答案 1 :(得分:0)

我喜欢使用xml阅读器和xml linq的组合

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XmlReader reader = XmlReader.Create(FILENAME);

            reader.ReadToFollowing("Modules4");
            XmlReader module4Subtree = reader.ReadSubtree();
            while (!module4Subtree.EOF)
            {
                if (module4Subtree.Name != "Module")
                {
                    module4Subtree.ReadToFollowing("Module");
                }
                if (!module4Subtree.EOF)
                {
                    XElement module = (XElement)XElement.ReadFrom(module4Subtree);
                    Module.modules.Add(new Module() { name = (string)module.Element("Name"), code = (string)module.Element("Code"), credits = (int)module.Element("Credits") });
                }

            }
        }
    }
    public class Module
    {
        public static List<Module> modules = new List<Module>();

        public string name { get; set; }
        public string code { get; set; }
        public int credits { get; set; }
    }
}
相关问题