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

a7o*_*ton 1 c# xml

我正在使用表单来显示XML元素.每次我点击列表框中的模块时,我想<Code>在表单上的标签中显示其值.我遇到的问题是,我所做的就是XML被一次性读取,而我无法或不知道如何在我的XML文件中搜索.所以我想我只需要一种搜索​​XML来查找<Code>元素的方法.

编辑:<Code>当我匹配<Name>列表框中的元素时,我试图在标签中显示元素的程度如下:

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();

}
Run Code Online (Sandbox Code Playgroud)

但问题是labelCodeNumber没有显示值code,而是显示了一些奇怪的集合.另外我不确定我是否正在输出正确的ielabelCodeNumber.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>
Run Code Online (Sandbox Code Playgroud)

最终编辑:我想通了!感谢Marcin和psubsee的帮助和贡献.下面的代码在listbox1_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();
}
Run Code Online (Sandbox Code Playgroud)

Hen*_*man 5

如果您正在一次阅读它,请不要使用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);
Run Code Online (Sandbox Code Playgroud)


Mar*_*zek 5

您应该更改您的概念并使用XDocument而不是XmlReader:

var document = XDocument.Load(workingDir + @"\ModulesList.xml");
Run Code Online (Sandbox Code Playgroud)

要填写列表框,请使用以下内容:

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

foreach(var item in items)
    listBox1.Items.Add(item);
Run Code Online (Sandbox Code Playgroud)

然后<code>从所选元素中找到您可以进行的那种Linq to XML查询:

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