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

本文关键字:元素 XML | 更新日期: 2023-09-27 18:29:46

我正在使用表单来显示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();
}

但问题是标签代码不显示code的值,而是显示一些奇怪的集合内容。我也不确定我是否在做正确的输出,即 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_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();
}

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

你应该改变你的概念,使用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);

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

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

如果您一次阅读所有内容,请不要使用 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);

有关使用 Xml.Linq 命名空间的要点很好,因为将数据加载到XDocument中并查询元素比您使用的XmlReader代码更清晰且更易于维护。 如果您曾经更改 xml 数据的格式或在另一种方法中重用代码,则更新查询比修改您拥有的XmlReader代码会更容易。 XmlReader 的唯一优点是,如果 XML 很大,并且您不希望一次将其全部读入内存。

(但你说你想与众不同(

将值添加到ListBox时遇到的问题与以下事实有关:ListBox.Items.AddRange()需要对象数组并且您正在尝试传递IEnumerable<String>。您需要首先将IEnumerable转换为数组,就像我之前回答您的另一个问题一样

listBox1.Items.AddRange(names.ToArray());
相关文章: