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

发布于 2024-12-05 11:32:44 字数 5565 浏览 0 评论 0原文

我在我编写的这个 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 并没有真正的经验,也许我犯了一个基本的错误。

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 crash.

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..

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

逆光下的微笑 2024-12-12 11:32:44

您正在尝试将文本节点转换为元素。请注意,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 循环中使用它:

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

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) {
    ...
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文