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

如何解析XML中CDATA内的元素并统计其出现次数?

解析XML中的CDATA内容并统计元素次数的解决方案

没问题,我来帮你搞定这个需求~你原来的代码只能识别外层的<RESPONSE>元素,但里面的CDATA块在XML解析器眼里是纯文本内容,不会自动解析成XML结构,所以得手动提取CDATA里的内容再二次解析。

修改后的完整代码

DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();

// 第一步:解析外层的XML文档
Document outerDoc = docBuilder.parse(new InputSource(new StringReader(response.toString())));
NodeList responseList = outerDoc.getElementsByTagName("RESPONSE");
System.out.println("Total RESPONSE elements: " + responseList.getLength());

// 第二步:遍历每个RESPONSE节点,处理内部的CDATA内容
for (int i = 0; i < responseList.getLength(); i++) {
    Node responseNode = responseList.item(i);
    // 提取CDATA中的XML文本(CDATA会被解析为文本节点,getTextContent()能拿到完整内容)
    String cdataXmlContent = responseNode.getTextContent().trim();
    
    // 第三步:把CDATA里的文本当作新XML文档解析
    if (!cdataXmlContent.isEmpty()) {
        Document innerDoc = docBuilder.parse(new InputSource(new StringReader(cdataXmlContent)));
        NodeList emailList = innerDoc.getElementsByTagName("EMAIL");
        System.out.println("Total EMAIL elements in CDATA: " + emailList.getLength());
        
        // 可选:逐个输出EMAIL的内容
        for (int j = 0; j < emailList.getLength(); j++) {
            Node emailNode = emailList.item(j);
            System.out.println("EMAIL " + (j+1) + ": " + emailNode.getTextContent());
        }
    }
}

关键知识点说明

  • CDATA的本质是XML里的文本节点,解析器不会解析它内部的标签,所以必须手动提取文本后二次解析
  • 使用getTextContent()可以直接获取CDATA块里的完整内容,不需要额外处理CDATA的标记(<![CDATA[和]]>会被自动忽略)
  • 调用trim()是为了去除内容开头结尾的换行和空白,避免解析时出现格式问题

内容的提问来源于stack exchange,提问作者CaveBatman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:34:12