在将节点转换为元素时,Dom XML解析器异常

时间:2011-09-18 20:44:09

标签: java android xml dom xml-parsing

我在我写的这个XML解析器中遇到了崩溃

public class LevelParser {
    Level parsedData=new Level();
    public Level getParsedData() {
         return parsedData;
    }
    public void parseXml(InputStream parseFile, int wantedLevel){
         Document doc;
         try {
             doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(parseFile);  
             Element root=doc.getDocumentElement();

             NodeList levels = root.getElementsByTagName("level");

             /* for levels*/
             for(int i=0;i<levels.getLength();i++) {
                Node c= levels.item(i);

                Element note=(Element)c;
                Debug.i("parser arrived here");

                int level = Integer.parseInt(note.getAttribute("id"));

                //only load the wanted level;
                if(level != wantedLevel)
                    continue;

                parsedData.setLevel(level);
                parsedData.setBackgroundName(note.getAttribute("backgroundname"));

                NodeList noteDetails=c.getChildNodes();

                for(int j=0;j<noteDetails.getLength();j++) {
                     Node c1=noteDetails.item(j);
                     if(c1.getNodeType()==Node.ELEMENT_NODE) {
                          Debug.i("parser arrived here1");
                          Element detail=(Element)c1;
                          Debug.i("parser arrived here2");
                          String nodeName=detail.getNodeName();

                          if(nodeName.equals("EnemyGroup")) {
                              Vector<Integer> temp_locations = parsedData.getEnemyLocations();
                              NodeList enemygroup=c1.getChildNodes();

                              parsedData.setEnemyNumber(enemygroup.getLength());

                              for(int x = 0;x < enemygroup.getLength(); x++) {
                                   Debug.i("parser arrived here3.0");
                                   Element location=(Element)enemygroup.item(x);
                                   Debug.i("parser arrived here4.0");
                                   temp_locations.add(new Integer(Integer.parseInt(location.getFirstChild().getNodeValue())));
                              }
                              parsedData.setEnemyLocations(temp_locations);
                          }
                          if(nodeName.equals("PlayerGroup")) {
                             Vector<Integer> temp_locations = parsedData.getPlayerLocations();
                             NodeList playergroup=c1.getChildNodes();
                             parsedData.setPlayerNumber(playergroup.getLength());
                             for(int x=0;x<playergroup.getLength();x++) {
                                  Debug.i("parser arrived here3.1");
                                  Element location=(Element)playergroup.item(x);
                                  Debug.i("parser arrived here4.1");
                                  temp_locations.add(new Integer(Integer.parseInt(location.getFirstChild().getNodeValue())));
                             }
                             parsedData.setPlayerLocations(temp_locations);
                          }
                          if(nodeName.equals("MonsterGroupLocations")) {
                                Vector<Location> temp_locations = parsedData.getEmptyLocations();
                                NodeList emptygroup=c1.getChildNodes();
                                parsedData.setEmptyNumber(emptygroup.getLength());
                                for(int x=0;x<emptygroup.getLength();x++) {
                                    Debug.i("parser arrived here3.2");
                                    Element location=(Element)emptygroup.item(x);
                                    Debug.i("parser arrived here4.2");
                                    int xl = Integer.parseInt(location.getAttribute("x"));
                                    int yl = Integer.parseInt(location.getAttribute("y"));
                                    temp_locations.add(new Location(xl , yl));
                                }
                                parsedData.setEmptyLocations(temp_locations);
                           }
                       }
                  }
            }
        } catch (SAXException e) {
             Debug.e(e.toString());
        } catch (IOException e) {
             Debug.e(e.toString());
        } catch (ParserConfigurationException e) {
             Debug.e(e.toString());
        } catch (FactoryConfigurationError e) {
             Debug.e(e.toString());
        }
    }
}

它在第112行以ClassCastException崩溃。我真的不明白为什么,因为我使用相同的代码前几行没有任何崩溃。

我正在解析此XML

<?xml version="1.0" encoding="utf-8"?>
<levelinfos>
    <level id="1" backgroundname="back_ground_level_1.png">
        <MonsterGroupLocations>
            <location x="100" y="150"></location>
            <location x="250" y="200"></location>
        </MonsterGroupLocations>
        <EnemyGroup>
            <index>0</index>
        </EnemyGroup>
        <PlayerGroup>
            <index>1</index>
        </PlayerGroup>
    </level>
</levelinfos>

调试时我看到它将Level.enemyNumber设置为5,而它应该只有2 ..所以可能还有其他错误。我在[{1}}中并没有真正的经验,也许我正在做一个基本的错误。

1 个答案:

答案 0 :(得分:2)

您正在尝试将Text节点强制转换为Element。请注意,Node#childNodes()返回节点的所有直接子节点,包括Element,Text,CData,Comment和ProcessingInstruction节点,而不仅仅是元素。您需要在使用NodeList时过滤NodeList,或者使用仅返回元素的便捷方法。我通常有这样的事情:

public static List<Element> elements(Node parent) {
    List<Element> result = new LinkedList<Element>();
    NodeList nl = parent.getChildNodes();
    for (int i = 0; i < nl.getLength(); ++i) {
        if (nl.item(i).getNodeType() == Node.ELEMENT_NODE)
            result.add((Element) nl.item(i));
    }
    return result;
}

您可以直接在for循环中使用它:

for (Element location: elements(c1) {
    ...
}