【问题标题】:C# WinForms - Import Data to Listbox from XMLC# WinForms - 从 XML 导入数据到列表框
【发布时间】:2015-10-15 01:11:39
【问题描述】:

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# xml winforms import


    【解决方案1】:

    更新:: 发布后我发现我继续搜索,然后找到了一个有效的

                XElement element = XElement.Load("XMLFile2.xml");
            foreach (XElement item in element.Elements("Regions"))
            listBox1.Items.Add(item.Value);
    

    【讨论】:

      【解决方案2】:
      1. select new { Item = i.Element("Regions").Value })是错误的,因为参数i已经是Regions的元素,所以你只需要像select new { Item = i.Value })这样改代码
      2. 不知道你有没有设置DisplayMember,也许你应该添加这个代码listBox1.DisplayMember = "Item";

      【讨论】:

        【解决方案3】:

        不知道这是否有意义,但关于读取 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>
        

        一些解释:

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

        xmlNodeList 选择节点,我所做的只是选择到 Product,所以下一个节点是名称,之后的下一个兄弟节点是价格。

        我确信 foreach 循环是不言自明的, 第一个 if 语句确保节点是一个元素, 第二个 if 语句检查产品名称(面包、牛奶等)是否与用户在开始时输入的内容匹配。如果是,则创建一个字符串,并命名为“name”,因为第一个孩子是名称,我们想要名称的节点值,因此 innerText 将为我们获取它。

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

        希望这有帮助吗?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-10-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-08
          相关资源
          最近更新 更多