【问题标题】:Converting XML to String[] help将 XML 转换为 String[] 帮助
【发布时间】:2011-05-30 08:44:32
【问题描述】:

我在将 XML 文档的内容转换为 int[] 或 string[] 时遇到问题 我正在将屏幕上 20 个不同图片框的 x 和 y 坐标(对于拼图程序)保存到 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;
        }
    }

我做错了什么???

【问题讨论】:

    标签: c# xml arrays writer


    【解决方案1】:

    您的 ReadXmlFile 方法实际上并没有做任何事情。

    考虑使用XmlDocument 或XDocument 而不是XmlWriter 和XmlReader。它们更容易处理。

    【讨论】:

      【解决方案2】:

      试试这个:

                 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);
              }
      

      【讨论】:

      • 我在调试时收到错误“值不能为空”这是什么意思?
      • 我修改了代码,检查一下
      【解决方案3】:

      以下 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-values 作为整数数组,则以下 LINQ 查询将起作用:

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

      【讨论】:

      • 有趣的是,这可能有效,但我将如何将所有 Tile X 和 Y 值转储到一个 Int[] 中,因为这就是我在程序中调用位置的方式。
      • 添加了一个以int[] 形式获取所有 X 值的查询。或者你的意思是你想把所有的 X 和所有的 Y 值放到一个数组中?如果是,为什么?
      • 我收到一条错误消息,提示“root”没有定义,我添加了“using.system.xml.linq;”到顶部,如果它也有助于这在表单应用程序中。
      • @Mathew:您使用的是 .NET 3.5/C# 3 还是更新版本? Linq2XML 在 .NET 2 中不可用。如果您不能使用较新的 .NET,那么恐怕我的回答对您没有帮助。
      • 顺便说一句,我刚刚注意到代码中实际上并不需要Root。您可以改为使用doc.Descendants("...")
      猜你喜欢
      • 2021-11-06
      • 2012-05-16
      • 2014-07-18
      • 2021-05-19
      • 2016-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多