Java XML解析问题:从<UserProfile>取值及代码优化指导
问题分析与代码优化指导
核心问题
- 目标标签不匹配:你要解析的是
<UserProfile>标签,但调用parseXml时传入的tagName是"crminfo",导致无法定位到正确的节点。 - 解析逻辑错误:原代码只提取元素的属性值,但你期望的
firstName、lastName等数据是<UserProfile>的子元素文本值,不是属性,所以原逻辑根本没处理这些内容。
优化后的代码
调用代码修正
String tagName = "UserProfile"; // 修正为目标标签名 logger.info(xmlResponse); List<Map<String, Object>> parsedXmlData = DataParserUtil.parseXml(xmlResponse, tagName, fieldMapping); logger.info("parsedXmlData: " + parsedXmlData);
解析工具类优化
public static List<Map<String, Object>> parseXml(String xml, String tagName, FieldMapping fieldMapping) throws Exception { if (StringUtils.isBlank(xml)) { return new ArrayList<>(); } // 移除BOM字符 if (xml.startsWith("\uFEFF")) { xml = xml.substring(1); } xml = xml.replaceAll("\uFEFF", ""); DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); Document document = builder.parse(new InputSource(new StringReader(xml))); NodeList nodeList = document.getElementsByTagName(tagName); List<Map<String, Object>> xmlObjects = new ArrayList<>(); Map<String, String> fieldMap = fieldMapping.getFieldMap(); for (int i = 0; i < nodeList.getLength(); i++) { Element element = (Element) nodeList.item(i); Map<String, Object> objectMap = new HashMap<>(); // 遍历fieldMapping中的所有映射字段,处理子元素文本值 for (Map.Entry<String, String> entry : fieldMap.entrySet()) { String jsonField = entry.getKey(); String xmlField = entry.getValue(); // 获取子元素 NodeList childNodes = element.getElementsByTagName(xmlField); String value = ""; if (childNodes.getLength() > 0) { // 提取子元素的文本内容,处理空值 value = StringUtils.defaultIfBlank(childNodes.item(0).getTextContent(), ""); } // 应用类型转换器 ValueConverter converter = fieldMapping.getConverter(jsonField); objectMap.put(jsonField, converter != null ? converter.convert(value) : value); } xmlObjects.add(objectMap); } return xmlObjects; }
关键改动说明
- 标签名修正:将调用时的
tagName改为"UserProfile",确保定位到正确的节点。 - 解析逻辑调整:从处理元素属性改为遍历
fieldMapping中的映射字段,通过getElementsByTagName获取对应子元素,提取其文本内容。 - 空值处理:用
StringUtils.defaultIfBlank确保空元素或无文本的元素存入空字符串,符合你期望的结果格式。 - 映射与转换:保留原有的字段映射和类型转换器逻辑,确保输出的key是你需要的
firstName这类名称,同时支持类型转换。
额外注意事项
- 确保
fieldMapping中的映射关系正确,比如"firstName"对应XML中的"firstName"子元素名,以此类推。 - 如果XML中
<UserProfile>是嵌套在其他父节点下,确保传入的XML包含完整的节点结构,或者可以先定位到父节点再处理子节点。
内容的提问来源于stack exchange,提问作者Beginercoder
相关产品推荐
相关产品推荐

