【问题标题】:Getting values from an XML into an array从 XML 中获取值到数组中
【发布时间】:2011-07-04 23:46:59
【问题描述】:

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

private void LoadMap(String path) { DocumentBuilderFactory 工厂 = DocumentBuilderFactory.newInstance ( ); 文档document = 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();
}

}

【问题讨论】:

    标签: java xml multidimensional-array


    【解决方案1】:

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

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

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

    其中 i == 1,返回一个文本节点。由于文本节点没有子节点,此时column为null,导致NPE。

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

    【讨论】:

    • 好的,谢谢。我已经用新的更改编辑了主要帖子的代码。现在它工作正常,但它跳过了非对行>。
    • 您的循环仍在使用来自 &lt;tileset&gt; 标记的计数。由于如果计算文本节点实际上存在更多节点,因此看到height 行节点和width 列节点后就无法停止。 for 循环需要更改为,例如,while(k &lt; width),并且只有在处理 &lt;col&gt; 节点时才增加 k
    • 好的,谢谢。现在使用该解决方案可以正常工作。但是我不喜欢这段代码,所以我发现如果我在java中激活XML验证并在XML中添加一个DTD信息,我可以跳过检查是否有文本节点,这样我就可以忘记他了。
    【解决方案2】:

    查看NullPointerExceptionjavadocs,

    当应用程序尝试 在对象是的情况下使用 null 必需的。

    这些包括:

    • 调用null的实例方法 目的。
    • 访问或修改 空对象的字段。
    • 采取 null 的长度,就好像它是一个数组一样。
    • 访问或修改 null 就好像它是一个数组一样。
    • 投掷 null 就好像它是一个 Throwable 值。
    • 应用程序应该抛出的实例 这个类来指示其他非法的 使用空对象。

    以上 6 个中的任何一个都可能是您在代码中犯的错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多