如何解析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
相关产品推荐
相关产品推荐

