开发者

Dom XML parser exception in converting node to element

I'm experiencing a crash in this XML parser I wrote

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());
        }
    }
}

It crashes at line 112 with a ClassCastException. I don't really understand why, as I use the same code few lines before without any cras开发者_开发百科h.

I'm parsing this 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>

While debugging I saw that it sets the Level.enemyNumber to 5, while it should be only 2.. so it's possible there are other errors. I'm not really experienced in XML, maybe I'm doing a basic mistake..


You are trying to cast a Text node to an Element. Note that Node#childNodes() returns all direct children of the node, including Element, Text, CData, Comment and ProcessingInstruction nodes, not just elements. You need to either filter the NodeList when using it or use a convenience method that returns just elements. I usually have something like this:

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;
}

You can use this directly in a for loop:

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜