2011-09-18 63 views
2

我遇到了这个XML解析器中的崩溃我写了在将节点转换为元素时,Dom 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 ..所以它可能还有其他错误。我在XML中没有经验,也许我在做一个基本的错误..

回答

2

您正在尝试将文本节点投射到元素。请注意,Node#childNodes()返回节点的所有直接子节点,包括Element,Text,CData,Comment和ProcessingInstruction节点,而不仅仅是元素。您需要在使用它时过滤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 (Element location: elements(c1) { 
    ... 
} 
+0

工程就像一个魅力,谢谢! –