2015-10-15 33 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,這將從下一個節點移動到下一個節點,這就是我們想要的。

希望這會幫助嗎?