将值从XML获取到数组中

时间:2011-07-04 00:59:02

标签: java xml multidimensional-array

我在从XML读取数据并将其加载到数组时遇到一些问题。这是我的代码:

private void LoadMap(String path){     DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();     文件文件= null;

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 个答案:

答案 0 :(得分:1)

问题在于您忽略了输入XML中只有空白文本节点的事实,这些节点在使用getChildNodes().item(i)时会占据索引位置。您必须检查每个节点类型并忽略非元素节点,以便只处理您想要的节点。

从你的输入中,我可以看出每行标记之间有一个空白节点,所以

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

其中i == 1,返回一个文本节点。由于文本节点没有子节点,此时column为空,从而产生NPE。

这也意味着您不能盲目地使用<tileset>标记中的计数作为循环边界。您必须在处理每个节点类型之前对其进行测试并计算实际处理的节点,直到达到预期的总数(顺便说一下,这是错误的;有50行和50列)。

答案 1 :(得分:0)

查看NullPointerException javadocs,

  

应用程序尝试时抛出   在对象是的情况下使用null   需要。

     

这些包括:

     
      
  • 调用null的实例方法   宾语。
  •   
  • 访问或修改   null对象的字段。
  •   
  • 接受   null的长度,好像它是一个数组。
  •   
  • 访问或修改   null就像它是一个数组。
  •   
  • 投掷   null,好像它是一个Throwable值。
  •   
  • 应用程序应抛出实例   此类表示其他非法行为   使用null对象。
  •   

上述任何一项都可能是您在代码中可能犯的错误。