首页 > 解决方案 > 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>

标签: c#

解决方案


我认为您可能在尝试获取 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);

如果您需要对我提到的内容进行任何澄清,请告诉我,我很乐意澄清。


推荐阅读