如何获取Java DOM Element元素值的实际数据类型而非全部识别为String
问题核心说明
XML本身是无内置类型语义的纯文本格式,如果你没有提前定义XML Schema(XSD),也没有给节点加xsi:type属性标注类型,不管是JAXB还是原生DOM接口,都没办法自动识别值的实际类型,默认只会返回字符串类型的内容。
可行解决方案
你可以根据自己的场景选对应的实现方式:
- 方案1:补充类型标注(最规范,无兼容问题)
给每个自定义节点增加xsi:type属性指定标准XML类型,JAXB可以直接根据这个属性自动转换为对应Java类型。修改后的节点示例如下:
配置JAXB上下文支持<rail:JourneyDate xsi:type="xs:date">2014-12-12</rail:JourneyDate> <rail:Name xsi:type="xs:string">Rajadhani</rail:Name> <rail:AxelCount xsi:type="xs:int">12</rail:AxelCount> <rail:VehicleCount xsi:type="xs:boolean">true</rail:VehicleCount> <rail:PassangerCount xsi:type="xs:float">20.5</rail:PassangerCount>xsi:type解析后,直接取值就能拿到对应类型的对象,不需要自己做格式转换。 - 方案2:自定义类型推断逻辑(无法修改原XML时使用)
如果不能调整XML内容,可以自己写类型推断工具类,按业务常用的类型优先级尝试转换字符串,匹配到对应格式就返回对应类型的对象,推断顺序参考:- 先判断是否为布尔值:匹配
true/false(忽略大小写)就转Boolean - 再判断是否为整数:全为数字、长度在int/long范围内就转对应数值类型
- 再判断是否为浮点数:包含
.且能正常解析为Float/Double就转对应浮点类型 - 再判断是否为日期:匹配业务常用的日期格式(比如示例中的
yyyy-MM-dd)就转LocalDate/Date - 以上都不匹配就返回原字符串
简单实现示例:
你可以根据自己的业务场景调整格式匹配的规则和优先级,避免误判。public Object inferValue(String content) { // 匹配布尔类型 if ("true".equalsIgnoreCase(content) || "false".equalsIgnoreCase(content)) { return Boolean.parseBoolean(content); } // 匹配整数类型 try { return Integer.parseInt(content); } catch (NumberFormatException e) { try { return Long.parseLong(content); } catch (NumberFormatException e1) { // 匹配浮点类型 try { return Double.parseDouble(content); } catch (NumberFormatException e2) { // 匹配日期类型 try { return LocalDate.parse(content, DateTimeFormatter.ofPattern("yyyy-MM-dd")); } catch (DateTimeParseException e3) { // 均不匹配返回原字符串 return content; } } } } } - 先判断是否为布尔值:匹配
- 方案3:固定节点名映射(自定义节点名固定时最优)
如果你用到的自定义节点名称是固定的,提前维护一份节点名和对应类型的映射表,读取节点时直接按映射的类型转换即可,准确率比通用推断高,不会出现格式误判的问题。
内容的提问来源于stack exchange,提问作者BATMAN_2008
相关产品推荐
相关产品推荐

