C# 如何读取Xml文件并将listView中的元素列表放在表单上

C# 如何读取Xml文件并将listView中的元素列表放在表单上,c#,C#,我有一个xml文件“modules.xml”,我试图从中加载表单中listView中每个模块的名称。我试过下面的代码,它没有给我错误,也没有工作 modules.xml <?xml version="1.0" encoding="utf-8" ?> <Modules> <Module> <Code>3SFE504</Code> <Name>Algorithms and Data Structures<

我有一个xml文件“modules.xml”,我试图从中加载表单中listView中每个模块的名称。我试过下面的代码,它没有给我错误,也没有工作

modules.xml

<?xml version="1.0" encoding="utf-8" ?>
<Modules>
  <Module>
    <Code>3SFE504</Code>
    <Name>Algorithms and Data Structures</Name>
    <Capacity>5</Capacity>
    <Semester>1</Semester>
    <Prerequisites>none</Prerequisites>
    <LectureSlot>Monday 9-11</LectureSlot>
    <TutorialSlot>Monday 11-1pm</TutorialSlot>
  </Module> -
  <Module>
    <Code>3SFE508</Code>
    <Name>3D Graphics 1</Name>
    <Capacity>5</Capacity>
    <Semester>1</Semester>
    <Prerequisites>none</Prerequisites>
    <LectureSlot>Monday 2-4pm</LectureSlot>
    <TutorialSlot>Monday 4-6pm</TutorialSlot>
  </Module> -
  <Module>
    <Code>3SFE513</Code>
    <Name>Event-Driven Programming</Name>
    <Capacity>10</Capacity>
    <Semester>1</Semester>
    <Prerequisites>none</Prerequisites>
    <LectureSlot>Tuesday 9-11</LectureSlot>
    <TutorialSlot>Tuesday 11-1pm</TutorialSlot>
  </Module>
  <Module>
    <Code>3SFE514</Code>
    <Name>Object-Oriented Design</Name>
    <Capacity>10</Capacity>
    <Semester>1</Semester>
    <Prerequisites>none</Prerequisites>
    <LectureSlot>Tuesday 2-4pm</LectureSlot>
    <TutorialSlot>Tuesday 4-6pm</TutorialSlot>
  </Module> -
  <Module>
    <Code>3SFE516</Code>
    <Name>Requirements Engineering</Name>
    <Capacity>10</Capacity>
    <Semester>1</Semester>
    <Prerequisites>none</Prerequisites>
    <LectureSlot>Thursday 9-11</LectureSlot>
    <TutorialSlot>Thursday 11-1pm</TutorialSlot>
  </Module>
  <Module>
    <Code>3SFE599</Code>
    <Name>Introduction to AI</Name>
    <Capacity>5</Capacity>
    <Semester>1</Semester>
    <Prerequisites>none</Prerequisites>
    <LectureSlot>Thursday 2-4pm</LectureSlot>
    <TutorialSlot>Monday 9-11</TutorialSlot>
  </Module> -
  <Module>
    <Code>3SFE540</Code>
    <Name>Java Mobile Application Development</Name>
    <Capacity>5</Capacity>
    <Semester>1</Semester>
    <Prerequisites>3SFE514</Prerequisites>
    <LectureSlot>Monday 11-1pm</LectureSlot>
    <TutorialSlot>Monday 2-4pm</TutorialSlot>
  </Module>
  <Module>
    <Code>3SFE541</Code>
    <Name>C# .Net Framework Programming</Name>
    <Capacity>5</Capacity>
    <Semester>1</Semester>
    <Prerequisites>3SFE514</Prerequisites>
    <LectureSlot>Monday 4-6pm</LectureSlot>
    <TutorialSlot>Tuesday 9-11</TutorialSlot>
  </Module>
  <Module>
    <Code>3SFE515</Code>
    <Name>Software Engineering Group Project</Name>
    <Capacity>5</Capacity>
    <Semester>2</Semester>
    <Prerequisites>3SFE514</Prerequisites>
    <LectureSlot>Monday 9-11</LectureSlot>
    <TutorialSlot>Monday 11-1pm</TutorialSlot>
  </Module>
  <Module>
    <Code>3SFE519</Code>
    <Name>Software Engineering</Name>
    <Capacity>10</Capacity>
    <Semester>2</Semester>
    <Prerequisites>none</Prerequisites>
    <LectureSlot>Monday 2-4pm</LectureSlot>
    <TutorialSlot>Monday 4-6pm</TutorialSlot>
  </Module>
  <Module>
    <Code>3SFE542</Code>
    <Name>Mobile User Interface Development</Name>
    <Capacity>5</Capacity>
    <Semester>2</Semester>
    <Prerequisites>3SFE540</Prerequisites>
    <LectureSlot>Tuesday 9-11</LectureSlot>
    <TutorialSlot>Tuesday 11-1pm</TutorialSlot>
  </Module>
  <Module>
    <Code>3MTS594</Code>
    <Name>Interactive Multimedia</Name>
    <Capacity>5</Capacity>
    <Semester>2</Semester>
    <Prerequisites>none</Prerequisites>
    <LectureSlot>Tuesday 2-4pm</LectureSlot>
    <TutorialSlot>Tuesday 4-6pm</TutorialSlot>
  </Module>
  <Module>
    <Code>3SFE555</Code>
    <Name>Concurrent Programming</Name>
    <Capacity>5</Capacity>
    <Semester>2</Semester>
    <Prerequisites>none</Prerequisites>
    <LectureSlot>Thursday 9-11</LectureSlot>
    <TutorialSlot>Thursday 11-1pm</TutorialSlot>
  </Module>
  <Module>
    <Code>3SFE557</Code>
    <Name>Mobile Gaming</Name>
    <Capacity>10</Capacity>
    <Semester>2</Semester>
    <Prerequisites>none</Prerequisites>
    <LectureSlot>Thursday 9-11</LectureSlot>
    <TutorialSlot>Monday 9-11</TutorialSlot>
  </Module>
  <Module>
    <Code>3SFE500</Code>
    <Name>Intelligent Systems</Name>
    <Capacity>10</Capacity>
    <Semester>2</Semester>
    <Prerequisites>3SFE599</Prerequisites>
    <LectureSlot>Monday 11-1pm</LectureSlot>
    <TutorialSlot>Monday 2-4pm</TutorialSlot>
  </Module>
  <Module>
    <Code>3SFE501</Code>
    <Name>3D Graphics II</Name>
    <Capacity>10</Capacity>
    <Semester>2</Semester>
    <Prerequisites>3SFE508</Prerequisites>
    <LectureSlot>Monday 4-6pm</LectureSlot>
    <TutorialSlot>Tuesday 9-11</TutorialSlot>
  </Module>
</Modules>
.cs文件是

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.IO;

namespace cw
{
    public partial class Form1 : Form
    {    
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            String workingDir = Directory.GetCurrentDirectory();
            XmlTextReader textReader = new XmlTextReader(workingDir + @"\modules.xml");
            XmlNodeType type;

            Console.WriteLine("BaseURI:" + textReader.BaseURI);


            while (textReader.Read())
            {
                type = textReader.NodeType;


                if (type == XmlNodeType.Element)
                {
                    if (textReader.Name == "Name")
                    {
                        textReader.Read();
                        listView1.Items.Add(textReader.Value);
                    }


                }
            }
            Console.ReadLine();
            textReader.Close();
        }

    }
}
我执行了一个文本并得出结论,我的while循环正在工作,但是if语句没有工作。

使用Linq2Xml

XDocument xDoc = XDocument.Load(new StringReader(xmlstr));
List<string> modules = xDoc
    .Descendants("Module")
    .Select(n => n.Element("Name").Value)
    .ToList();

foreach(var item in modules)
    listView1.Items.Add(item);
XDocument xDoc=XDocument.Load(新的StringReader(xmlstr));
列表模块=xDoc
.后代(“模块”)
.Select(n=>n.Element(“Name”).Value)
.ToList();
foreach(模块中的变量项)
listView1.Items.Add(项目);
根据您的xml结构。您可以直接使用let数据集进行读取 您的xml文件使用(filepath)方法。你可以 还要指定xml模式

它在我身边起作用。试试这个:

DataSet ds = new DataSet();
  ds.ReadXml("c:\\xmlFile.xml");

        if (ds.Tables.Count > 0)
        {
            dataGridView1.DataSource = ds.Tables[0];
            foreach (DataRow item in ds.Tables[0].Rows)
            {
                listView1.Items.Add(item["Name"].ToString());
            }
        }

如果你考虑更复杂的XML,那么我建议你按“.L.B建议”进行。

< P>试试这个

 DataSet ds = new DataSet();
        ds.ReadXml(Server.MapPath("XMLFile1.xml"));
        lsview.DataSource = ds.Tables[0];
        lsview.DataBind();
aspx中的代码

<asp:ListView ID="lsview" runat="server" >
<ItemTemplate>
<%# Eval("Name") %>
</ItemTemplate>
</asp:ListView>


@ZainAfzal,在物品前面添加一个
var
。不要只是复制和粘贴,试着理解代码。我做了,但现在它不接受“xmlstr”。我不必指定xml文件的位置或名称而不是“xmlstr”@ZainAfzal我通过从字符串加载xml来测试您的案例。如果要从文件加载,可以使用
XDocument.Load(File.Open(…)
。我看不出你有任何努力。只需查看
XDocument
@ZainAfzal的帮助,当然您需要指定位置!xmlstr只是一个需要根据需要设置的变量。@L.B,我可以问一下,为什么需要使用File.Open(..)或StreamReader(),当它像一个符咒一样使用简单的路径时?@L.B的回答表明这是一种干净的方法。但是,您的代码有什么问题。你说它不起作用是什么意思。这对我来说很好!我已经从代码中删除了while和if语句,并用LB提供的代码替换了整个方法。错误出现在“xmlstr”上,它表示“该名称在当前上下文中不存在”,您的老师应该告诉您停止使用
new XmlTextReader()
。自.NET 2.0以来,它一直被弃用。改用
XmlReader.Create()
。与
XmlTextWriter
相同。他还应该告诉您使用块将
XmlReader
放入
中。
DataSet
是一个糟糕的通用解决方案,因为它只适用于可以映射到关系结构的XML。是的。我同意您的看法,但是xml结构太简单,可以使用dataset导入。如果它没有很难从XML和关系结构过滤标签,那么我会考虑LIQ2XML…哦,我知道在这种情况下它会起作用。我只是说,
DataSet
并不总是有效的。例如,如果同一个元素有“两个父”元素,那么它要么失败,要么在需要一个表时生成两个表。