c# WinForms -从XML中导入数据到列表框

本文关键字:数据 列表 导入 WinForms XML | 更新日期: 2023-09-27 18:17:41

XML代码

-<RegionBox>
<Regions>fdzg</Regions>
<Regions>asgfasd</Regions>
<Regions>sdfadga</Regions>
<Regions>adsfgsfha</Regions>
</RegionBox>

如何保存XML

 XElement element = new XElement("RegionBox");
        foreach (var item in listBox1.Items)
        {
            element.Add(new XElement("Regions", item));

            //DataRow listRow = ds.Tables["RegionBox"].NewRow();
            //listRow["List"] = listBox1.Items;
            //Console.WriteLine(item);
        }
        XDocument document = new XDocument();
        document.Add(element);
        document.Save("XMLFile2.xml");

我希望能够将数据导入到列表框中目前我已经尝试了

            ds.ReadXml("XMLFile2.xml");
        {
        for (int i = 0; i < ds.Tables["RegionBox"].Columns.Count; i++)
            listBox1.Items.Add(ds.Tables["Regions"].Rows[0][i].ToString());
        setImage.BackgroundImage = System.Drawing.Image.FromFile(filePath.Text);
        }

            XDocument xmlDoc = XDocument.Load("XMLFile2.xml");
        var items = (from i in xmlDoc.Descendants("Regions")
                     select new { Item = i.Element("Regions").Value }).ToList();
                     listBox1.DataSource = items;

但是我似乎无法让它导入信息…虽然我已经成功地获得了第一项或最后一项,但只有一项而不是所有的项可以导入

谢谢

c# WinForms -从XML中导入数据到列表框

更新::就在发布这篇文章之后,我发现我继续搜索,然后找到了一个工作

            XElement element = XElement.Load("XMLFile2.xml");
        foreach (XElement item in element.Elements("Regions"))
        listBox1.Items.Add(item.Value);
  1. select new { Item = i.Element("Regions").Value })是错误的,因为参数i已经是Regions的元素,所以您只需要更改代码,如select new { Item = i.Value })
  2. 我不知道你是否设置了DisplayMember,也许你应该添加这个代码listBox1.DisplayMember = "Item";

不知道这是否有多大意义,但是关于读取xml数据然后显示它-

XmlTextReader xReader = new XmlTextReader("../../Products.xml");
        xReader.WhitespaceHandling = WhitespaceHandling.None;
        XmlDocument xDoc = new XmlDocument();
        xDoc.Load(xReader);
        Console.WriteLine("Please enter product...");
        string product = Console.ReadLine();
        XmlNodeList xNodeList = xDoc.DocumentElement.SelectNodes("//Products/Product");
        foreach (XmlNode xNode in xNodeList)
        {
            if (xNode.NodeType == XmlNodeType.Element)
            {
               // Console.WriteLine(xNode.NodeType.ToString() + " : " + xNode.Name + " =" + xNode.FirstChild.InnerText);
                if (xNode.FirstChild.InnerText == product)
                {
                    string name = xNode.FirstChild.InnerText;
                    string price = xNode.FirstChild.NextSibling.InnerText;
                    Console.WriteLine("Name: " + name + "... Price: R" + price);
                }
                else
                {
                    Console.WriteLine("No Price");
                }
            }
        }
        Console.ReadLine();

XML文件为Products.xml -

<Products>
<Product>
    <name>Bread</name>
    <price>10</price>
</Product>
<Product>
    <name>Milk</name>
    <price>20</price>
</Product>
<Product>
    <name>Coke</name>
    <price>18</price>
</Product>
<Product>
    <name>BarOne</name>
    <price>7</price>
</Product>

一些解释:

XmlTextReader只能在你添加using System.Xml;命名空间,一旦你初始化一个XmlTextReader (xReader),你可以用一个。xml文件加载它,我的是Products.xml,它是从调试文件夹中找到2个文件夹,因此("../../")-跳过两个文件夹,这实际上是根文件夹,但2个文件夹的"调试"文件夹。

xmlNodeList选择节点,我在这里所做的是只选择到Product,所以下一个节点是name,之后的兄弟节点是price。

我相信foreach循环是不言自明的,第一个if语句确保节点是一个元素,第二个if语句检查产品名称(面包、牛奶等)是否与用户在开始时输入的名称匹配。如果是这样,那么一个字符串就会生成,并命名为"name",因为第一个子元素是名字,我们想要名字的节点值,所以innerText会为我们获取那个。

要获得价格,我们只需写入xNode.FirstChild.NextSibling。InnerText,这将从第一个节点移动到下一个节点,这是我们想要的。

希望这有帮助?