XML 反序列化不在数组容器中的数组
XML Deserialize an array that is not in an array container
我有一个 XML 文件(用于 Tiled 磁贴编辑器):(xml 的片段)
<map version="1.0" orientation="orthogonal" renderorder="right-down" width="64" height="64" tilewidth="32" tileheight="32" nextobjectid="1">
<tileset firstgid="1" name="GrassyTile_01" tilewidth="32" tileheight="32" tilecount="4" columns="2">
<image source="GrassyTile_01.png" width="64" height="64"/>
</tileset>
<tileset firstgid="5" name="BlackTile_01" tilewidth="32" tileheight="32" tilecount="1" columns="1">
<image source="BlackTile_01.jpg" width="32" height="32"/>
</tileset>
关于 "tileset" 个元素,可以有 X 个元素,但它们不包含在 XmlArray 中,而是一个接一个。
我正在寻找一种使用 XMLSerializer 将这些元素反序列化为数组的方法,但我找不到正确的方法。
这是我的代码:
[XmlRoot("map")]
public class XMLMAP
{
[XmlAttribute("version")]
public string Version;
[XmlAttribute("orientation")]
public string Orientation;
[XmlAttribute("renderorder")]
public string Renderorder;
[XmlAttribute("width")]
public int Width;
[XmlAttribute("height")]
public int Height;
[XmlAttribute("tilewidth")]
public int Tilewidth;
[XmlAttribute("tileheight")]
public int TileHeight;
[XmlAttribute("nextobjectid")]
public int NextObjectID;
[XmlArray]
public XMLMAP_TILESET[] TileSets;
[XmlRoot("tileset")]
public class XMLMAP_TILESET
{
[XmlAttribute("firstgid")]
public string FirstGID;
//No need for rest of code
}
}
有人知道这是否可行,或者我必须求助于 XMLReader 吗?
尝试将您的 XMLMAP
class 重新定义为:
[XmlRoot("map")]
public class XMLMAP
{
[XmlAttribute("version")]
public string Version;
[XmlAttribute("orientation")]
public string Orientation;
[XmlAttribute("renderorder")]
public string Renderorder;
[XmlAttribute("width")]
public int Width;
[XmlAttribute("height")]
public int Height;
[XmlAttribute("tilewidth")]
public int Tilewidth;
[XmlAttribute("tileheight")]
public int TileHeight;
[XmlAttribute("nextobjectid")]
public int NextObjectID;
[XmlElement("tileset")]
public List<TileSet> TileSets;
}
[XmlRoot("tileset")]
public class TileSet
{
[XmlAttribute("firstgid")]
public string FirstGID;
}
其中 XMLMAP
包含 List<TileSet>
,然后 TileSet
被定义为包含所有必需属性等的单独 class
我现在可以反序列化
var serializer = new XmlSerializer(typeof(XMLMAP));
var reader = new StreamReader(path);
var map = (XMLMAP)serializer.Deserialize(reader);
reader.Close();
并且可以看到 map
包含 2 TileSet
s
的列表
请注意,我只能在您提供的 xml 末尾添加结束 </map>
标记后执行此操作。
希望对您有所帮助
我有一个 XML 文件(用于 Tiled 磁贴编辑器):(xml 的片段)
<map version="1.0" orientation="orthogonal" renderorder="right-down" width="64" height="64" tilewidth="32" tileheight="32" nextobjectid="1">
<tileset firstgid="1" name="GrassyTile_01" tilewidth="32" tileheight="32" tilecount="4" columns="2">
<image source="GrassyTile_01.png" width="64" height="64"/>
</tileset>
<tileset firstgid="5" name="BlackTile_01" tilewidth="32" tileheight="32" tilecount="1" columns="1">
<image source="BlackTile_01.jpg" width="32" height="32"/>
</tileset>
关于 "tileset" 个元素,可以有 X 个元素,但它们不包含在 XmlArray 中,而是一个接一个。
我正在寻找一种使用 XMLSerializer 将这些元素反序列化为数组的方法,但我找不到正确的方法。
这是我的代码:
[XmlRoot("map")]
public class XMLMAP
{
[XmlAttribute("version")]
public string Version;
[XmlAttribute("orientation")]
public string Orientation;
[XmlAttribute("renderorder")]
public string Renderorder;
[XmlAttribute("width")]
public int Width;
[XmlAttribute("height")]
public int Height;
[XmlAttribute("tilewidth")]
public int Tilewidth;
[XmlAttribute("tileheight")]
public int TileHeight;
[XmlAttribute("nextobjectid")]
public int NextObjectID;
[XmlArray]
public XMLMAP_TILESET[] TileSets;
[XmlRoot("tileset")]
public class XMLMAP_TILESET
{
[XmlAttribute("firstgid")]
public string FirstGID;
//No need for rest of code
}
}
有人知道这是否可行,或者我必须求助于 XMLReader 吗?
尝试将您的 XMLMAP
class 重新定义为:
[XmlRoot("map")]
public class XMLMAP
{
[XmlAttribute("version")]
public string Version;
[XmlAttribute("orientation")]
public string Orientation;
[XmlAttribute("renderorder")]
public string Renderorder;
[XmlAttribute("width")]
public int Width;
[XmlAttribute("height")]
public int Height;
[XmlAttribute("tilewidth")]
public int Tilewidth;
[XmlAttribute("tileheight")]
public int TileHeight;
[XmlAttribute("nextobjectid")]
public int NextObjectID;
[XmlElement("tileset")]
public List<TileSet> TileSets;
}
[XmlRoot("tileset")]
public class TileSet
{
[XmlAttribute("firstgid")]
public string FirstGID;
}
其中 XMLMAP
包含 List<TileSet>
,然后 TileSet
被定义为包含所有必需属性等的单独 class
我现在可以反序列化
var serializer = new XmlSerializer(typeof(XMLMAP));
var reader = new StreamReader(path);
var map = (XMLMAP)serializer.Deserialize(reader);
reader.Close();
并且可以看到 map
包含 2 TileSet
s
请注意,我只能在您提供的 xml 末尾添加结束 </map>
标记后执行此操作。
希望对您有所帮助