2015-10-15 31 views
0

XML代码 C#的WinForms - 将数据导入到列表框从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; 

但我似乎无法得到它来导入信息...虽然我已成功获得第一个项目或最后一个项目,但只有一个,而不是所有的项目都可以导入

感谢

回答

0

更新::刚刚发布此之后,我发现我继续搜索,然后找到一个工作

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

不知道这是否会多大意义,但关于读取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的只能访问一次添加使用的System.Xml的;命名空间,一旦你初始化一个XmlTextReader(xReader),你可以加载一个.xml文件,我的Products.xml是从调试文件夹中找到2个文件夹,因此(“../../”) - 跳过两个文件夹,这实际上是根文件夹,但2个文件夹不在“调试”文件夹中。

xmlNodeList选择节点,我在那里做的只是选择产品,所以下一个节点是名称,并且之后的下一个兄弟节点是价格。

我相信foreach循环是自我解释, 第一if语句确保该节点是一个元素, 第二if语句检查产品名称(面包,牛奶等),匹配什么用户在开始时输入。如果是这样,则会创建一个字符串,并将其命名为“name”,因为第一个子项是名称,我们需要该名称的节点值,因此innerText将为我们获取该名称。

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

希望这会帮助吗?