#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("...")
вместо