【问题标题】:Read XML with Elements and csv's into 2D array using XDocument in C#/XNA使用 C#/XNA 中的 XDocument 将带有 Elements 和 csv 的 XML 读入二维数组
【发布时间】:2012-03-09 22:55:41
【问题描述】:

我有一个 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 中)将“地图”读入 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") 上收到“未找到选择”错误。

我完成的数组应该看起来像 {{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());

这给了我想要的数据,但“测试”输出在调试中显示为类型:{System.Linq.Enumerable.WhereSelectEnumerableIterator&lt;System.Xml.Linq.XElement,int[][]&gt;}

越来越近了,但还是不太对!

【问题讨论】:

  • 你必须改变你的)。查看我的编辑。

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


【解决方案1】:

做吧

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&lt;IEnumerable&lt;int[][]&gt;&gt;(关卡和地图列表)。

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

【讨论】:

  • 其他代码使用我将读取的数据作为一个矩形数组 - 但这是简单的一点:)
  • 非常感谢您的帮助!
猜你喜欢
  • 2015-05-16
  • 2014-09-13
  • 1970-01-01
  • 1970-01-01
  • 2014-06-04
  • 2011-08-12
  • 1970-01-01
  • 2014-08-07
  • 1970-01-01
相关资源
最近更新 更多