Преобразование XML в строку [] справка

#c# #xml #arrays #writer

#c# #xml #массивы #writer

Вопрос:

У меня возникли проблемы с преобразованием содержимого XML-документа в int[] или string [] Я сохраняю координаты x и y 20 различных графических блоков на экране (для программы jigsaw Puzzle) в 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 amp; 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:

Ваш 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);
        }
  

Комментарии:

1. Я получаю ошибку «Значение не может быть нулевым» в debug что именно это означает?

2. Я изменил код, ознакомьтесь с ним

Ответ №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 -значения в виде массива целых чисел, следующий запрос LINQ будет работать:

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

Комментарии:

1. Интересно, это могло бы сработать, но как бы я собрал все значения Tile X и Y в один Int[], поскольку именно так я вызываю позиции в своей программе.

2. Добавлен запрос, который получает все значения X в виде int[] . Или вы имеете в виду, что хотите объединить все значения X и Y в один массив? Если да, то почему?

3. Я получаю сообщение об ошибке, в котором говорится, что нет определения для «root», я добавил «using.system.xml.linq;» в начало, если это также помогает, это в приложении form.

4. @Mathew: Используете ли вы .NET 3.5 / C # 3 или новее? Linq2XML недоступен в .NET 2. Если вы не можете использовать более новую версию .NET, то, боюсь, мой ответ вам не поможет.

5. Кстати, я только что заметил, что Root это на самом деле не нужно в коде.. Вы можете сделать doc.Descendants("...") вместо