使用C#/ XNA中的XDocument将XML和Elements和csv读入2D数组

时间:2012-03-09 22:55:41

标签: c# xml linq multidimensional-array linq-to-xml

我有一个带有Elements的XML文件,如下所示:

<level>
        <name>Name of Level 1</name>
        <number>1</number>
        <authorTime>8.55</authorTime>
        <scoringTime>20</scoringTime>
        <map width="19" height="15"><!--Level1-->
            <row>0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0</row>
            <row>2,-1,-1,-1,-1,-1,-1,-1,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,2</row>
            <row>2,-1,-1,-1,0,1,0,-1,2,-1,0,-1,-1,-1,-1,-1,0,-1,2</row>
            <row>0,1,0,-1,2,-1,-1,-1,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,2</row>
            <row>2,-1,-1,-1,2,-1,0,1,0,1,0,-1,0,0,-1,0,0,-1,2</row>
            <row>2,-1,0,1,0,-1,-1,-1,2,-1,-1,-1,-1,2,-1,-1,2,-1,2</row>
            <row>2,-1,-1,3,2,-1,0,-1,2,-1,0,-1,-1,2,-1,-1,2,-1,2</row>
            <row>2,-1,0,1,0,0,0,-1,0,-1,0,1,1,0,-1,-1,2,-1,2</row>
            <row>0,1,0,-1,-1,2,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2,-1,2</row>
            <row>2,-1,2,-1,-1,0,1,0,1,0,-1,0,1,0,1,1,0,-1,2</row>
            <row>2,-1,0,0,-1,-1,-1,0,-1,2,-1,2,-1,0,-1,-1,2,-1,2</row>
            <row>2,-1,2,-1,-1,0,-1,-1,-1,2,-1,2,-1,-1,-1,-1,2,-1,2</row>
            <row>2,-1,0,0,-1,0,1,1,1,0,1,0,-1,0,1,1,0,-1,2</row>
            <row>2,5,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,2</row>
            <row>0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0</row>
        </map>
    </level>

我想使用XDocument(在C#/ XNA中)将“map”读入2D矩形数组(y,x) - 所以在这个例子中它将是int [15,19]。

我能想到的只是创建一个锯齿状的数组并在以后转换为矩形数组 - 类似于

int[][] test = ((from level in xDoc.Descendants("level")
                select (from map in level.Element("map")
                            select (from row in map.Elements("row")
                                    select (int.Parse(row.Value))).ToArray()).ToArray()));

但是我知道我需要在这里用逗号分隔字符串;无论如何,我在level.Element(“map”)上得到一个“select not found”错误。

我完成的数组应该看起来像{{0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,1,0}, {2,-1,-1,-1,-1,-1,-1,-1,2,-1,-1,-1,-1,-1,-1,-1,-1, -1,2},...

有人可以帮忙吗?

- 编辑 -

我现在有:

    var test = (from level in xDoc.Descendants("level")
                    select (from row in level.Elements("map").Elements("row")
                        select (from col in row.Value.Split(',')
                            select (int.Parse(col))).ToArray()).ToArray());

它给了我想要的数据,但“test”输出在调试中显示为类型:{System.Linq.Enumerable.WhereSelectEnumerableIterator<System.Xml.Linq.XElement,int[][]>}

越来越近,但仍然不太正确!

1 个答案:

答案 0 :(得分:2)

只是做到了

select (from row in map.Elements("row").Value.Split(',')
        select (int.Parse(row) ...

然后将其称为col而不是row可能是有意义的。

  

我能想到的只是创建一个锯齿状阵列并稍后转换为矩形阵列

为何转换?一个锯齿状的阵列似乎很好。


修改

我给了它一个测试:

        var test =
            from level in doc.Descendants("level")
            select (from map in level.Elements("map")
                select (from row in map.Elements("row")
                        select (from col in row.Value.Split(',') 
                          select int.Parse(col)).ToArray()).ToArray() );

这会为您提供IEnumerabl<IEnumerable<int[][]>>(关卡和地图列表)。

所以test.First().First()是你的第一个数组。