C# 如何在XML-C中匹配元素

C# 如何在XML-C中匹配元素,c#,xml,C#,Xml,我正在使用一个表单来显示XML元素。每次单击列表框中的模块时,我都希望在表单上的标签中显示其值。我遇到的问题是,我这样做的方式是XML一次被全部读取,而我无法或不知道如何在XML文件中搜索。所以我想我需要一种在XML中搜索元素的方法 编辑:以下是当元素与列表框中的元素匹配时,我尝试在标签中显示该元素的程度: private void listBox1_SelectedIndexChanged(object sender, EventArgs e) { var document = XD

我正在使用一个表单来显示XML元素。每次单击列表框中的模块时,我都希望在表单上的标签中显示其值。我遇到的问题是,我这样做的方式是XML一次被全部读取,而我无法或不知道如何在XML文件中搜索。所以我想我需要一种在XML中搜索元素的方法

编辑:以下是当元素与列表框中的元素匹配时,我尝试在标签中显示该元素的程度:

private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{

    var document = XDocument.Load(workingDir + @"\ModulesList.xml");

    var code = from d in document.Descendants("Name")
               where d.Value == listBox1.SelectedItem.ToString()
               select d.Parent.Element("Code").Value;

    labelCodeNumber.Text = code.ToString();

}
但问题是labelCodeNumber不显示代码的值,而是显示一些奇怪的集合内容。此外,我也不确定是否正确输出,即labelCodeNumber.Text=code.ToString

下面是XML:

<?xml version="1.0" encoding="utf-8" ?>
<SoftwareEngineering>
  <Module>
    <Name>Algorithms and Data Structures</Name>
    <Code>3SFE504</Code>
    <Capacity>5</Capacity>
    <Semester>1</Semester>
    <Prerequisite>none</Prerequisite>
  </Module>
  <Module>
    <Name>3D Graphics I</Name>
    <Code>3SFE508</Code>
    <Capacity>5</Capacity>
    <Semester>1</Semester>
    <Prerequisite>none</Prerequisite>
  </Module>
  <Module>
    <Name>Event-Driven Programming</Name>
    <Code>3SFE513</Code>
    <Capacity>10</Capacity>
    <Semester>1</Semester>
    <Prerequisite>none</Prerequisite>
  </Module>
  <Module>
    <Name>Object Oriented Design</Name>
    <Code>3SFE514</Code>
    <Capcity>10</Capcity>
    <Semester>1</Semester>
    <Prerequisite>none</Prerequisite>
  </Module>
  <Module>
    <Name>Requirements Engineering</Name>
    <Code>3SFE516</Code>
    <Capacity>10</Capacity>
    <Semester>1</Semester>
    <Prerequisite>none</Prerequisite>
  </Module>
  <Module>
    <Name>Introduction to AI</Name>
    <Code>3SFE599</Code>
    <Capacity>5</Capacity>
    <Semester>1</Semester>
    <Prerequisite>none</Prerequisite>
  </Module>
  <Module>
    <Name>Java Mobile Application Development</Name>
    <Code>3SFE540</Code>
    <Capacity>5</Capacity>
    <Semester>1</Semester>
    <Prerequisite>3SFE514(corequisite)</Prerequisite>
  </Module>
  <Module>
    <Name>C# .NET Programming</Name>
    <Code>3SFE541</Code>
    <Capacity>5</Capacity>
    <Semester>1</Semester>
    <Prerequisite>3SFE514(corequisite)</Prerequisite>
  </Module>
  <Module>
    <Name>Software Engineering Group Project</Name>
    <Code>3SFE515</Code>
    <Capacity>5</Capacity>
    <Semester>2</Semester>
    <Prerequisite>3SFE514(corequisite)</Prerequisite>
  </Module>
  <Module>
    <Name>Software Engineering</Name>
    <Code>3SFE519</Code>
    <Capacity>10</Capacity>
    <Semester>2</Semester>
    <Prerequisite>none</Prerequisite>
  </Module>
  <Module>
    <Name>Mobile User Interface Development</Name>
    <Code>3SFE542</Code>
    <Capacity>5</Capacity>
    <Semester>2</Semester>
    <Prerequisite>3SFE540</Prerequisite>
  </Module>
  <Module>
    <Name>Interactive Multimedia</Name>
    <Code>3MTS954</Code>
    <Capacity>5</Capacity>
    <Semester>2</Semester>
    <Prerequisite>none</Prerequisite>
  </Module>
  <Module>
    <Name>Concurrent Programming</Name>
    <Code>3SFE555</Code>
    <Capacity>5</Capacity>
    <Semester>2</Semester>
    <Prerequisite>none</Prerequisite>
  </Module>
  <Module>
    <Name>Mobile Gaming</Name>
    <Code>3SFE557</Code>
    <Capacity>10</Capacity>
    <Semester>2</Semester>
    <Prerequisite>none</Prerequisite>
  </Module>
  <Module>
    <Name>Intelligent Systems</Name>
    <Code>3SFE500</Code>
    <Capacity>10</Capacity>
    <Semester>2</Semester>
    <Prerequisite>3SFE599</Prerequisite>
  </Module>
  <Module>
    <Name>3D Graphics II</Name>
    <Code>3SFE501</Code>
    <Capacity>10</Capacity>
    <Semester>2</Semester>
    <Prerequisite>3SFE508</Prerequisite>
  </Module>
</SoftwareEngineering>
最终编辑: 我知道了!感谢Marcin和psubsee的帮助和贡献。下面的代码位于listbox1\u selectedindexchanged方法中

var code = from d in document.Descendants("Name")
           where d.Value == (String) listBox1.SelectedItem
           select d.Parent.Element("Code").Value;

foreach (var item in code)
{
    labelCodeNumber.Text = item.ToString();
}

如果您同时阅读所有内容,则不要使用XmlReader

将它加载到XDocument中,您可以使用LINQ查找您想要的任何内容

XDocument doc = XDocument.Load(fileName);  // do this 1x

// untested
var names = doc.Root.Descendants("Module").Elements("Name").Select(e => e.Value);
listBox1.Items.AddRange(names);

如果您同时阅读所有内容,则不要使用XmlReader

将它加载到XDocument中,您可以使用LINQ查找您想要的任何内容

XDocument doc = XDocument.Load(fileName);  // do this 1x

// untested
var names = doc.Root.Descendants("Module").Elements("Name").Select(e => e.Value);
listBox1.Items.AddRange(names);

您应该改变观念,使用XDocument而不是XmlReader:

var document = XDocument.Load(workingDir + @"\ModulesList.xml");
要填充列表框,请使用以下内容:

var items = From d in document.Descendants("Name")
            select d.Value;

foreach(var item in items)
    listBox1.Items.Add(item);
然后,要从所选元素中查找,您可以进行这种Linq到XML的查询:

var code = From d in document.Descendants("Name")
           where d.Value == SelectedName
           select d.Parent.Element("Code").Value

您应该改变观念,使用XDocument而不是XmlReader:

var document = XDocument.Load(workingDir + @"\ModulesList.xml");
要填充列表框,请使用以下内容:

var items = From d in document.Descendants("Name")
            select d.Value;

foreach(var item in items)
    listBox1.Items.Add(item);
然后,要从所选元素中查找,您可以进行这种Linq到XML的查询:

var code = From d in document.Descendants("Name")
           where d.Value == SelectedName
           select d.Parent.Element("Code").Value

关于使用Xml.Linq名称空间的要点是好的,因为将数据加载到XDocument并查询元素比您正在使用的XmlReader代码更容易查看和维护。如果更改xml数据的格式或在另一种方法中重用代码,那么更新查询将比修改现有的XmlReader代码更容易。XmlReader的唯一优势是,如果XML很大,您不想一次将其读入内存

但你说你想与众不同

向ListBox添加值时遇到的问题与ListBox.Items.AddRange需要一个对象数组,而您正试图传递IEnumerable有关。您需要首先将IEnumerable转换为数组,就像我前面的代码一样


关于使用Xml.Linq名称空间的要点是好的,因为将数据加载到XDocument并查询元素比您正在使用的XmlReader代码更容易查看和维护。如果更改xml数据的格式或在另一种方法中重用代码,那么更新查询将比修改现有的XmlReader代码更容易。XmlReader的唯一优势是,如果XML很大,您不想一次将其读入内存

但你说你想与众不同

向ListBox添加值时遇到的问题与ListBox.Items.AddRange需要一个对象数组,而您正试图传递IEnumerable有关。您需要首先将IEnumerable转换为数组,就像我前面的代码一样


看到我对类似问题的回答了吗?类似问题没有人自己做作业吗?@L.B我是!它只是不起作用,加上我告诉你我正在努力做一些事情different@AZ1别担心,我们的智者已经有精神问题了。他说话的方式似乎总是这样。看到我对一个类似问题的回答了吗?类似的问题没有人自己做作业吗?@L.B我是!它只是不起作用,加上我告诉你我正在努力做一些事情different@AZ1别担心,我们的智者已经有精神问题了。他说话的方式似乎总是这样。很抱歉我不知道,我查看了文档,找不到合适的名称空间,无法使用方法加载以及从、子体等。您能提供吗?我尝试使用System.Xml.Linq;使用System.Xml.Linq.XDocument;使用System.Xml.Xml文档;var document=XmlDocument.LoadworkingDir+@\ModulesList.xml;这是不正确的。OP应该使用var document=XDocument.LoadworkingDir+@\ModulesList.xml@AZ1请尝试System.Xml.Linq。这是所有基于Linq的XML XDocument类XElement的名称空间,etc@psubsee2003感谢之前的修复,我正在使用System.Xml.Linq,但由于某些原因,它无法识别诸如“where”和“select”等关键字@AZ1这就是为什么有些人讨厌扩展方法,因为如果没有引用正确的名称空间,可能会造成混淆。大多数基于Linq的方法都是扩展方法,不作为方法驻留在特定类型中。Select和Where实际上是系统的一部分。Linq名称空间。很抱歉,我看到了
e文档,找不到正确的名称空间,无法使用方法加载以及从、子体等。您能提供吗?我尝试使用System.Xml.Linq;使用System.Xml.Linq.XDocument;使用System.Xml.Xml文档;var document=XmlDocument.LoadworkingDir+@\ModulesList.xml;这是不正确的。OP应该使用var document=XDocument.LoadworkingDir+@\ModulesList.xml@AZ1请尝试System.Xml.Linq。这是所有基于Linq的XML XDocument类XElement的名称空间,etc@psubsee2003感谢之前的修复,我正在使用System.Xml.Linq,但由于某些原因,它无法识别诸如“where”和“select”等关键字@AZ1这就是为什么有些人讨厌扩展方法,因为如果没有引用正确的名称空间,可能会造成混淆。大多数基于Linq的方法都是扩展方法,不作为方法驻留在特定类型中。Select和Where实际上是System.Linq命名空间的一部分。这就是为什么我说//未测试。AddRangenames.ToList可能会起作用,或者作为foreach循环的最后手段。我知道我让每个人都很紧张,但我无法理解这件事。如何构造foreach?我在doc中尝试了foreachXElement名称,但它说foreach不能在XDocument类型上操作,这就是为什么我说//未测试。AddRangenames.ToList可能会起作用,或者作为foreach循环的最后手段。我知道我让每个人都很紧张,但我无法理解这件事。如何构造foreach?我在文档中尝试了foreachXElement名称,但它说foreach无法对XDocument类型进行操作