遍历xml文件并将内容存储在Textfield c#中
Posted
技术标签:
【中文标题】遍历xml文件并将内容存储在Textfield c#中【英文标题】:Iterate through xml file and store content inside Textfield c# 【发布时间】:2017-12-09 11:56:46 【问题描述】:我有一个 Xml 文件,我想在其中循环每个模块节点,每个模块节点递增 1。这是我的 xml 文件的示例:
<PersonDetails>
<PersonTitle>Teacher</PersonTitle>
<Keystage3>
<Subject>
<subjectName>maths</subjectName>
<subjectId>qq1</subjectId>
<subjectvalue>20</subjectvalue>
<subjectscore />
</Subject>
<Subject>
<subjectName>science</subjectName>
<subjectId>sla1s</subjectId>
<subjectvalue>25</subjectvalue>
<subjectscore />
</Subject>
</Keystage3>
</PersonDetails>
我想遍历 xml 文件并获取两者的所有主题数据
<Subject>
节点并将每个值存储在一个变量中。
我有一段代码从特定节点获取值并输出 它在文本字段上。
这是我目前的代码:
public partial class Form1 : Form
private string subName, subId, subvalue;
public XmlDocument Doc;
public Form1()
InitializeComponent();
private void button1_Click(object sender, EventArgs e)
XmlTextReader reader = new XmlTextReader("data.xml");
XmlNodeType type;
while (reader.Read())
type = reader.NodeType;
if(type == XmlNodeType.Element)
if (reader.Name == "subjectName")
reader.Read();
textBox1.Text = reader.Value;
if (reader.Name == "subjectId")
reader.Read();
textBox2.Text = reader.Value;
if (reader.Name == "subjectvalue")
reader.Read();
textBox3.Text = reader.Value;
reader.Close();
我怎样才能使收到的输出类似于:
maths,qq1,20
science,sla1s,25
【问题讨论】:
非常不幸的是,主题节点会像这样递增,而不是将数字作为属性或子元素。我认为您无法控制该 xml 的生成方式? 我已经定制了它,以便每次写入主题节点时,值都会增加 1。我怎样才能使每个主题节点都可以在节点内有一个属性来显示数字? 我不知道您是如何创建 XML 但任何 XML API 都将支持属性。 【参考方案1】:使用一些 LINQ-Magic,您可以执行以下操作:
XElement root = XElement.Load("data.xml");
var subjects = from subject in root.Descendants()
where subject.Name.LocalName.Contains("Subject")
select new
SubjectName = subject.Element("subjectName").Value,
SubjectId = subject.Element("subjectId").Value,
SubjectValue = subject.Element("subjectvalue").Value
;
foreach (var subject in subjects)
Console.WriteLine(subject);
//you can use subject like this:
string subjectName = subject.SubjectName;
string subjectId = subject.SubjectId;
string subjectValue = subject.SubjectValue;
这将打印:
SubjectName = maths, SubjectId = qq1, SubjectValue = 20
SubjectName = science, SubjectId = sla1s, SubjectValue = 25
包括:
using System;
using System.Data;
using System.Linq;
using System.Windows.Forms;
using System.Xml.Linq;
【讨论】:
@user7388968 您能否提供更多信息(行、异常类型、堆栈跟踪)。您可能需要使用 VS2017 和 .net 4.6.1。但它绝对适合我。 进一步按照您的代码是否可以在动态创建的输入框中输出值? @user7388968 你可以创建一些文本框,但管理布局会很困难。我建议使用 DataTable,您应该能够通过 Google 搜索找到一些基本示例。【参考方案2】:您可以使用XDocument
来执行它。如果您想将节点值存储为一个集合,您可以像这样为SubjectNode
创建一个类;
public class SubjectNode
public string SubjectName get; set;
public string SubjectId get; set;
public string SubjectValue get; set;
然后你可以这样检索数据;
var xdoc = XDocument.Load("data.xml");
var keystageNode = xdoc.Descendants("Keystage3").FirstOrDefault();
var iterateNode = keystageNode.FirstNode;
var subjectNodes = new List<SubjectNode>();
while (iterateNode != null)
var node = (XElement)iterateNode.NextNode;
subjectNodes.Add(new SubjectNode
SubjectName = node.Element("subjectName").Value,
SubjectId = node.Element("subjectId").Value,
SubjectValue = node.Element("subjectvalue").Value
);
iterateNode = iterateNode.NextNode;
【讨论】:
如果可能的话,请您解释一下为什么要对 node.Value 执行 nodeValue + 1。 我理解你的问题,你想增加subjectvalue +1。我说的对吗? 我想读取以上是关于遍历xml文件并将内容存储在Textfield c#中的主要内容,如果未能解决你的问题,请参考以下文章
实现将递归遍历文件,并将文件路径存储到map中且可以进行不同形式的查询,增加,删除等操作