【问题标题】:Getting nested values with XML reader in C#在 C# 中使用 XML 阅读器获取嵌套值
【发布时间】:2017-11-23 11:42:20
【问题描述】:

我在尝试获取 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;


                    }
                }
            }
        }
    }

这是我的代码。

谢谢。

【问题讨论】:

  • 首先,您确定需要 XmlReader(即您的数据约为 1GB 或更多)吗?因为使用 XElement 会容易得多。
  • 我没用过,只是觉得 XmlReader 更简单。
  • 你想的很不对。看看 System.Xml.Linq;

标签: c# xml xmlreader


【解决方案1】:

您当前代码的问题是 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)
        {
            ...
        }
    }
}

【讨论】:

    【解决方案2】:

    我喜欢结合使用 xml reader 和 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; }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-12
      • 1970-01-01
      • 2012-06-24
      • 2013-03-22
      • 1970-01-01
      相关资源
      最近更新 更多