2011-05-30 186 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