Чтение XML с элементами и csv в 2D-массив с использованием XDocument в C # / XNA - PullRequest
0 голосов
/ 10 марта 2012

У меня есть 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()));

Но я знаю, что где-то здесь нужно разделить строку запятыми; и в любом случае я получаю ошибку «выберите не найден» на уровне. Элемент («карта»).

Мой законченный массив должен выглядеть так: {{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}, ...

Может кто-нибудь помочь?

- EDIT -

Теперь у меня есть:

    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 Ответ

2 голосов
/ 10 марта 2012

Просто сделайте это

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() - ваш первый массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...