c# - c#尝试将XML解析为ListBox时超出范围
问题描述
我是编程新手,但我试图将 XML 文件中单个字段的所有条目加载到 ListBox 中。这似乎在执行表单时正确加载了 XML 文件,但是,这段代码出现了超出范围的异常:
using System.Xml.Serialization;
using System.IO;
using System.Xml;
using System.Xml.Linq;
namespace TP1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
XmlDocument xmldocIntern = new XmlDocument();
xmldocIntern.Load(@"InternList.xml");
foreach (XmlNode node in xmldocIntern.DocumentElement)
{
string theTitle = node.Attributes[0].Value;
lstBxListIntern.Items.Add(theTitle);
}
}
这是我的 XML 文件的示例:
<?xml version="1.0"?>
<ArrayOfInternship xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Internship>
<Title>Marketing</Title>
<Start>2019-03-08T00:00:00</Start>
<End>2019-04-12T00:00:00</End>
<Supervisor>John Smith</Supervisor>
<Comments>Web site makeover.</Comments>
</Internship>
</ArrayOfInternship>
解决方案
我认为您可能在尝试获取 Title 标记的值时遇到问题,因为您尝试获取每个 XML 元素的第一个属性,但唯一具有属性的元素是ArrayOfInternship
.
有几种方法可以从数组中的所有 Internship 元素中提取所有标题。
首先是循环并使用XmlDocument
你的代码使用的类
XmlDocument doc = new XmlDocument();
doc.Load(@"InternList.xml");
// Loop over child nodes of <ArrayOfInternship>...
foreach (XmlNode node in doc.DocumentElement)
{
// Loop over the child nodes of the <Internship> nodes
foreach (XmlNode child in node.ChildNodes)
{
if (child.Name.Equals("Title", StringComparison.OrdinalIgnoreCase))
{
lstBxListIntern.Items.Add(child.InnerText);
}
}
}
我提出的第二个解决方案个人更喜欢,因为它更简洁。您可能希望使用上述解决方案,因为您是初学者,而且您很可能会更容易阅读。但这是使用 LINQ to XML 的另一个解决方案。
XElement xml = XElement.Load(@"InternList.xml");
var titles = xml.Descendants("Title")
.Select(x => x.Value)
.ToList();
lstBxListIntern.Items.AddRange(titles);
如果您需要对我提到的内容进行任何澄清,请告诉我,我很乐意澄清。
推荐阅读
- javascript - 为什么我的网站在移动设备上左对齐
- python - Matplotlib 堆积面积图非常参差不齐且未连接
- php - Laravel 数据透视表与关系列分组
- angular - 无法在 app.component Ionic / Angular 中获取数据
- c++ - 使用 Cpp 基于 Qt 中的类属性对 QList 进行排序
- c# - 如何识别控制台用户输入中的虚线命令?
- reactjs - Next.js 中的持久布局与 TypeScript
- r - R工作室的八小时平均值
- bash - 在 Bash 中使用包含空格的目录名
- r - 将长字符串列表拆分为逗号分隔的向量,然后转换为 df 行