在 C# 中使用 XML reader 获取嵌套值
Getting nested values with XML reader in C#
我在尝试获取 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 文件,我正在尝试创建一个条件,如果 reader 找到 "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;
}
}
}
}
}
这是我的代码。
谢谢。
您当前代码的问题是 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)
{
...
}
}
}
我喜欢结合使用 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; }
}
}
我在尝试获取 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 文件,我正在尝试创建一个条件,如果 reader 找到 "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;
}
}
}
}
}
这是我的代码。
谢谢。
您当前代码的问题是 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)
{
...
}
}
}
我喜欢结合使用 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; }
}
}