[英]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.