2011-05-30 220 views
1

我遇到麻煩將XML文檔的內容轉換爲int []或字符串[] 我將20個不同圖片框的x和y座標保存在屏幕上一個拼圖程序)到一個xml文件,現在正在嘗試加載已保存的座標並將拼圖碎片更新到已保存的位置。將XML轉換爲字符串[]幫助

繼承人我的代碼:

XmlWriter XmlWriter1; 
    XmlReader XmlReader1; 
    private void Form1_Load(object sender, EventArgs e) 
    { 
     //------------------------------------------------- 
     //Load Events 
     //------------------------------------------------- 
     SavedPositions = new int[40]; 
    } 
    //------------------------------------------------------- 
    //Saves The Current Tile Locations To A Hidden XML File 
    //------------------------------------------------------- 
    public void SavePicPositionsXML() 
    { 
     using (XmlWriter1 = XmlWriter.Create("SavedPuzzle.xml")) 
     { 
      XmlWriter1.WriteStartDocument(); 
      XmlWriter1.WriteStartElement("MTiles"); 
      for (int i = 0; i < JigsawImgCount; i++) 
      { 
       XmlWriter1.WriteStartElement("Tile"); 
       XmlWriter1.WriteElementString("X",Convert.ToString(MTiles[i].Pic.Location.X)); 
       XmlWriter1.WriteElementString("Y",Convert.ToString(MTiles[i].Pic.Location.Y)); 
       XmlWriter1.WriteEndElement(); 
      } 
      XmlWriter1.WriteEndElement(); 
      XmlWriter1.WriteEndDocument(); 
     } 
    } 
    //--------------------------------------------------------------- 
    //Reads Text From A Hidden Xml File & Adds It To A String Array 
    //--------------------------------------------------------------- 
    private int ReadXmlFile(int Z) 
    { 
     XmlReader1 = XmlReader.Create("SavedPuzzle.xml"); 
     XmlReader1.MoveToContent(); 
     while (XmlReader1.Read()) 
     { 

     } 
     // SavedPositions[B] = Convert.ToInt32(XmlReader1.Value.ToString()); 
     return SavedPositions[Z]; 
    } 
    //------------------------------------------------- 
    //Loads Saved Tile Positions From A Hidden Xml File 
    //------------------------------------------------- 
    private void LoadPositionsXML() 
    { 
     G = 0; 
     for (int i = 0; i < JigsawImgCount; i++) 
     { 
      LineX = ReadXmlFile(G); 
      LineY = ReadXmlFile(G + 1); 
      MTiles[i].Pic.Location = new Point(LineX, LineY); 
      G = G + 2; 
     } 
    } 

什麼我做錯了???

+1

你會得到什麼錯誤? – 2011-05-30 08:51:41

回答

0

您的ReadXmlFile方法沒有做任何事情。

考慮使用XmlDocumentXDocument而不是XmlWriterXmlReader。他們更容易處理。

0

試試這個:

  XmlDocument document = new XmlDocument(); 
     document.Load(@"D:/SavedPuzzle.xml"); 
     XmlNode topNode = document.GetElementsByTagName("MTiles")[0]; 
     foreach (XmlNode node in topNode.ChildNodes) 
     { 
      int X = Int32.Parse(node.ChildNodes[0].InnerText); 
      int Y = Int32.Parse(node.ChildNodes[1].InnerText); 
     } 
+0

在調試中出現錯誤「Value can not be null」,究竟意味着什麼? – Matthew 2011-05-30 10:37:09

+0

我修改了代碼,檢查出 – BreakHead 2011-05-30 11:03:11

0

以下LinqToXML語句將提取所有瓷磚到它們存儲在文檔中的順序列表。

我假設,看起來像這樣的XML文件:

<xml> 
    <MTiles> 
    <Tile> 
     <X>1</X> 
     <Y>10</Y> 
    </Tile> 
    <Tile> 
     <X>2</X> 
     <Y>20</Y> 
    </Tile> 
    <Tile> 
     <X>3</X> 
     <Y>30</Y> 
    </Tile> 
    <Tile> 
     <X>4</X> 
     <Y>40</Y> 
    </Tile> 
    </MTiles> 
</xml> 

而這個代碼將加載它,並提取所有的瓦到枚舉列表。記得把using System.Xml.Linq在文件的頂部,並建立針對最近足夠的框架(IIRC,據介紹在.net 3.5)

XDocument doc = XDocument.Load(/* path to the file, or use an existing reader */); 
var tiles = from tile in doc.Descendants("Tile") 
      select new 
      { 
       X = (int)tile.Element("X"), 
       Y = (int)tile.Element("Y"), 
      }; 
foreach (var tile in tiles) 
{ 
    Console.WriteLine("Tile: x={0}, y={1}", tile.X, tile.Y); 
} 

從代碼的輸出上面使用我指定的XML文件是:

Tile: x=1, y=10 
Tile: x=2, y=20 
Tile: x=3, y=30 
Tile: x=4, y=40 

編輯: 如果你只是想所有的X - 值作爲一個整數數組,下面的LINQ查詢會的工作:

int[] allXValues = (from tile in doc.Descendants("Tile") 
        select (int)tile.Element("X")).ToArray();  
+0

有趣的這可能會工作,但我怎麼會傾倒所有瓷磚X和Y值到一個Int [],因爲這是我如何在我的程序中調用位置。 – Matthew 2011-05-30 10:39:41

+0

添加了一個將所有X值作爲int []'的查詢。或者你的意思是你想把所有的X和所有的Y值都放到一個數組中?如果是這樣,爲什麼? – 2011-05-30 10:49:45

+0

我收到一個錯誤,提示沒有「root」的定義,我添加了「using.system.xml.linq;」到頂端,如果它也有助於這是一個表單應用程序。 – Matthew 2011-05-30 10:56:41