You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java读取XML文件时出现ClassCastException错误求助

排查并解决Java XML解析的ClassCastException问题

嘿,我帮你找到了导致java.lang.ClassCastException的两个关键问题,咱们一步步修复:

错误原因分析

这个异常提示你试图把com.sun.org.apache.xerces.internal.dom.DeferredTextImpl(DOM文本节点类型)强制转换成org.w3c.dom.Element(元素节点类型),这是因为代码里存在循环变量错误,还没有正确过滤节点类型。

问题1:内层循环变量更新错误

你的内层for循环里,错误地把循环变量j的增量写成了i++,这会导致j永远停在0,i不断增大,既会引发循环逻辑混乱,还会导致后续节点访问出错:

// 错误写法
for (int j = 0; j<listaDeExemplares.getLength(); i++)

问题2:if语句多了多余的分号

这段代码里的分号让if条件变成了空语句,不管当前节点是不是元素节点,强转逻辑都会执行:

// 错误写法
if(noFilho.getNodeType()==Node.ELEMENT_NODE);
Element elementoFilho = (Element) noFilho;

XML解析时,标签之间的换行、空格会被解析成文本节点,当代码尝试把这些文本节点转成Element时,就会抛出ClassCastException。

修复后的完整代码

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.xml.sax.SAXException;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;

public class LeituraXML { 
    public static void main(String[] args) throws SAXException, IOException { 
        try { 
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
            DocumentBuilder builder = factory.newDocumentBuilder(); 
            Document doc = builder.parse("C:\\catalogo.xml"); 
            NodeList catalogo = doc.getElementsByTagName("rec"); 
            int tamanhoDoCatalogo = catalogo.getLength(); 
            
            for (int i = 0; i < tamanhoDoCatalogo; i++){ 
                Node noExemplar = catalogo.item(i); 
                if (noExemplar.getNodeType() == Node.ELEMENT_NODE){ 
                    Element elementoExemplar = (Element)noExemplar; 
                    NodeList listaDeExemplares = elementoExemplar.getChildNodes(); 
                    
                    // 修复1:把i++改成j++
                    for (int j = 0; j < listaDeExemplares.getLength(); j++){ 
                        Node noFilho = listaDeExemplares.item(j); 
                        // 修复2:去掉if后面的分号,把强转逻辑放到if块内
                        if(noFilho.getNodeType() == Node.ELEMENT_NODE){
                            Element elementoFilho = (Element) noFilho; 
                            switch(elementoFilho.getTagName()){ 
                                case "v018": 
                                    System.out.println(elementoFilho.getTextContent()); 
                                    break; // 建议加上break,避免后续case被执行
                            } 
                        }
                    } 
                } 
            } 
        } catch (ParserConfigurationException ex) { 
            Logger.getLogger(LeituraXML.class.getName()).log(Level.SEVERE, null, ex); 
        } 
    } 
}

额外提示

DOM解析XML时会保留所有空白文本节点(比如标签间的换行、空格),所以必须通过getNodeType() == Node.ELEMENT_NODE严格过滤出元素节点后再处理,避免类型转换错误。

内容的提问来源于stack exchange,提问作者Costa.Gustavo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:47:44