简体   繁体   English

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

[英]Getting nested values with XML reader in C#

I have a problem where I am trying to get the values of my nested elements in my XML file.我在尝试获取 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>

This is the XML file, i am trying to create a condition where if the reader finds the "Modules4" Element, then get the nested elements "Name", "Code" and "Credits" if this question has been answered, please direct me to it as I can not find it anywhere.这是 XML 文件,我试图创建一个条件,如果读者找到“Modules4”元素,然后获取嵌套元素“Name”、“Code”和“Credits”(如果此问题已回答),请指导我因为我在任何地方都找不到它。

    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;


                    }
                }
            }
        }
    }

This is my code.这是我的代码。

Thanks.谢谢。

The problem with your current code is that the switch is only reached when reader.Name is "Modules4" , never one of its children.您当前代码的问题在于,只有在reader.Name"Modules4"时才到达switch ,而不是它的子代之一。

If I were you I'd use the ReadSubtree() method:如果我是你,我会使用ReadSubtree()方法:

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

Then you can process the subtree in a separate method:然后您可以在单独的方法中处理子树:

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

I like using combination of xml reader and xml linq我喜欢结合使用 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; }
    }
}

Assume that in our example we have a xml with root node Reports and there are nested child nodes Reports and we need to loop through each child 假设在我们的示例中,我们有一个带有根节点Reports的xml,并且有嵌套的子节点Reports,我们需要遍历每个子节点

sample.xml sample.xml

 <?xml version="1.0" encoding="utf-8" ?> <Reports> <Report> <Code>CP</Code> <RepeatStyle>Weekly</RepeatStyle> </Report> <Report> <Code>USS</Code> <Name>User Snapshot</Name> <RepeatStyle>Monthly</RepeatStyle> </Report> <Report> <Code>USS</Code> <Name>Failed Logon Report</Name> <RepeatStyle>Monthly</RepeatStyle> </Report> <Report> <Code>USS</Code> <Name>Failed Logon Report</Name> <RepeatStyle>Monthly</RepeatStyle> </Report> </Reports> 

Here we can make use of System.Xml.XmlDocument which we used to read the Xml file given in the target location and System.Xml.XmlNodeList to pick up the certain nodes 在这里,我们可以利用System.Xml.XmlDocument来读取目标位置中给出的Xml文件,并使用System.Xml.XmlNodeList来拾取某些节点

XmlDocument serverDoc = new XmlDocument();
serverDoc.Load("sample.xml");
XmlNodeList xml = serverDoc.SelectNodes("Reports/Report");

foreach (XmlNode node in xml)
{
      var code = node.SelectSingleNode("Code").InnerText;
      var repeatStyle = node.SelectSingleNode("RepeatStyle").InnerText;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM