Получение значений из XML в массив - PullRequest
2 голосов
/ 04 июля 2011

У меня проблемы с чтением данных из XML и загрузкой их в массив. Вот код, который у меня есть:

private void LoadMap (String path) { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance (); Документ документа = ноль;

try {
    DocumentBuilderFactory builder = DocumentBuilderFactory.newInstance();
    builder.setIgnoringElementContentWhitespace(true);
    document = builder.newDocumentBuilder().parse(path);

    Element Map = document.getDocumentElement();
    Node nodeTileset = Map.getElementsByTagName("tileset").item(0);
    Node nodeData = Map.getElementsByTagName("data").item(0);

    NamedNodeMap attribTileset = nodeTileset.getAttributes();
    layers = Integer.parseInt(attribTileset.getNamedItem("layers").getNodeValue());
    width = 50;
    height = 50;
    name = Map.getAttribute("name");

    // Creamos el array y lo rellenamos con los valores
    array = new int[layers][height][width];

    Node layer, row, column;
    for(int i = 0; i < layers; i++) {
        layer = nodeData.getChildNodes().item(i);
        for(int j = 0; j < height; j++) {
            if(layer.getNodeType() != Node.TEXT_NODE) {
                row = layer.getChildNodes().item(j);
                for(int k = 0; k < width; k++) {
                    if(row.getNodeType() != Node.TEXT_NODE) {
                        column = row.getChildNodes().item(k);
                        if(column.getNodeType() != Node.TEXT_NODE) {
                            array[i][j][k] = Integer.parseInt(column.getTextContent());
                        }
                    }
                }
            }
        }
    }
}
catch(ParserConfigurationException e) {
    e.printStackTrace();
}
catch (SAXException e) {
    e.printStackTrace();
}
catch(IOException e) {
    e.printStackTrace();
}

}

Ответы [ 2 ]

1 голос
/ 04 июля 2011

Проблема в том, что вы проигнорировали тот факт, что во входном XML есть текстовые узлы только для пробелов, которые занимают позиции индекса при использовании getChildNodes().item(i).Вы должны проверить каждый тип узла и игнорировать неэлементные узлы, чтобы обрабатывать только те, которые вам нужны.

Исходя из вашего ввода, я могу сказать, что между строками каждого тега строки есть пробел, поэтому

column = row.getChildNodes().item(k);

, где i == 1, возвращает текстовый узел.Поскольку у текстового узла нет дочерних узлов, column на этом этапе является нулевым, что приводит к NPE.

Это также означает, что вы не можете слепо использовать счетчики из тега <tileset> в качестве границ цикла.Вы должны проверить каждый тип узла перед его обработкой и считать фактически обработанные узлы до тех пор, пока не достигнете ожидаемых итогов (что, кстати, неверно; имеется 50 строк и 50 столбцов).

0 голосов
/ 04 июля 2011

Посмотрите на NullPointerException javadocs,

Брошенный, когда приложение пытается использовать нуль в случае, когда требуется объект.

К ним относятся:

  • Вызов метода экземпляра нулевого объекта.
  • Доступ или изменение поля нулевого объекта.
  • Взятие длины нуля, как если бы это был массив.
  • Доступ или изменение пустых слотов, как если бы это был массив.
  • Бросать ноль, как если бы это было значение Throwable.
  • Приложения должны выбрасывать экземпляры этого класса, чтобы указать на другое недопустимое использование нулевого объекта.

Любая из вышеперечисленных 6 может быть ошибкой, которую вы допустили в своем коде.

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