Во время десериализации Xml матрица возвращает ноль - PullRequest
0 голосов
/ 28 февраля 2020

Получено много проб для десериализации следующего XML файла:

<?xml version="1.0" encoding="UTF-8"?>
<map version="1.2" tiledversion="1.3.1" orientation="orthogonal" renderorder="right-down" compressionlevel="0" width="80" height="50" tilewidth="16" tileheight="16" infinite="0" nextlayerid="2" nextobjectid="1">
 <tileset firstgid="1" name="TilesetSA" tilewidth="16" tileheight="16" tilecount="4000" columns="80">
  <image source="../../TilesetSA.png" width="1280" height="800"/>
 </tileset>
 <layer id="1" name="Walls" width="80" height="50">
  <data encoding="csv">
3,3,3,3,3,3,3,3,3,3,3,3,3,3,
3,81,81,81,81,81,81,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,3,3,3,3,3,3,3,3,3,3,3,
3,3,3,3,3,3,3,3,3,3,3,3,3,3,
</data>
 </layer>
</map>

У меня нет возможности изменить файл xml, он должен остаться как есть. Мне удалось получить все атрибуты для «map», «tileset» и «image», но в элементе «layer» можно получить только атрибуты (id, name, width, height), элемент данных всегда остается нулевым.

Я создал специальные классы для "map", "tileset", "layer", "image" и "map".

Кто-нибудь посоветует мне какой-нибудь код для решения этого "нулевого результата" вопрос

Ответы [ 2 ]

0 голосов
/ 28 февраля 2020

Мой код выглядит следующим образом:

        public virtual void WriteSaveXmlData(string pPath, int pRoom, bool pNewGame, int pX, int pY)
    {
        //xml save serialization
        XmlSaving XmlGameSave = new XmlSaving();
        XmlGameSave.SaveRootPath = pPath;
        XmlGameSave.SavedCurrentRoom = pRoom;
        XmlGameSave.XmlIsNewGame = pNewGame;
        XmlGameSave.XHero = pX;
        XmlGameSave.YHero = pY;

        XmlSerializer xs = new XmlSerializer(typeof(XmlSaving));

        using (StreamWriter wr = new StreamWriter(GameRound.GameSaveRootPath + GameRound.SaveFileName))
        {
            xs.Serialize(wr, XmlGameSave);
        }
    }
    public virtual XmlSaving ReadSaveXmlData()
    {
        //xml save deserialization

        XmlSerializer xs = new XmlSerializer(typeof(XmlSaving));

        using (StreamReader rd = new StreamReader(GameRound.GameSaveRootPath + GameRound.SaveFileName))
        {
            XmlSaving XmlGameSave = xs.Deserialize(rd) as XmlSaving;

            return XmlGameSave;

        }

    }
    public virtual XmlMap ReadXmlMapData(string pPath, int RoomNumber)
    {

        XmlMap ReadTmxData = new XmlMap();
        XmlSerializer TmxXmlMap = new XmlSerializer(typeof(XmlMap));
        using (StreamReader rd = new StreamReader(pPath + @"P1\RoomMapSaphir0" + RoomNumber + ".tmx"))
        {
            ReadTmxData = TmxXmlMap.Deserialize(rd) as XmlMap;
            return ReadTmxData;
        }


    }
0 голосов
/ 28 февраля 2020

Используйте следующее xml linq:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication159
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);
            string dataStr = (string)doc.Descendants("data").FirstOrDefault();

            int[][] results = dataStr.Split(new char[] {'\n'}, StringSplitOptions.RemoveEmptyEntries).Select(x => x.Split(new char[] {','}, StringSplitOptions.RemoveEmptyEntries).Select(y => int.Parse(y)).ToArray()).ToArray();
        }
    }
}
...