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