Java读取XML查询:无需大量if判断实现需求的简便方案咨询
解决方案:无大量判断+非JAXB实现XML查询映射
核心思路
用HashMap建立描述与查询配置的映射,读取XML时将每个<description value>作为键,对应的查询语句、操作类型、下载文件名封装成对象作为值存入映射表。后续用户选择描述后,直接查表获取配置执行逻辑,彻底避免大量if/else判断。
步骤1:定义查询配置载体类
先写一个简单的POJO,用来存储每个描述对应的所有信息:
public class QueryConfig { // 操作类型:SEARCH/UPDATE/DOWNLOAD private String operationType; // 对应的SQL语句 private String sql; // 下载功能所需的文件名 private String filename; // 构造方法、getter/setter 省略 }
步骤2:读取XML并构建映射表
用Java原生DOM解析XML(轻量无需额外依赖),遍历节点填充HashMap:
import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import java.io.File; import java.util.HashMap; import java.util.Map; public class QueryConfigLoader { public static Map<String, QueryConfig> loadConfig(String xmlPath) throws Exception { Map<String, QueryConfig> configMap = new HashMap<>(); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(new File(xmlPath)); // 假设XML中每个查询节点是<query>,包含<description value="xxx"/>、<operation>、<sql>、<filename> NodeList queryNodes = doc.getElementsByTagName("query"); for (int i = 0; i < queryNodes.getLength(); i++) { Element queryElement = (Element) queryNodes.item(i); // 获取描述值 Element descElement = (Element) queryElement.getElementsByTagName("description").item(0); String descValue = descElement.getAttribute("value"); // 封装配置对象 QueryConfig config = new QueryConfig(); config.setOperationType(queryElement.getElementsByTagName("operation").item(0).getTextContent()); config.setSql(queryElement.getElementsByTagName("sql").item(0).getTextContent()); // 下载类型才需要filename,非下载类型可以设为null if ("DOWNLOAD".equals(config.getOperationType())) { config.setFilename(queryElement.getElementsByTagName("filename").item(0).getTextContent()); } configMap.put(descValue, config); } return configMap; } }
步骤3:业务逻辑调用
在处理JSP请求的Java代码中,直接通过用户选择的描述从映射表取配置执行:
// 项目启动时加载一次,避免重复读XML private static final Map<String, QueryConfig> QUERY_CONFIG_MAP; static { try { QUERY_CONFIG_MAP = QueryConfigLoader.loadConfig("path/to/your/config.xml"); } catch (Exception e) { throw new RuntimeException("加载查询配置失败", e); } } // 处理用户请求的方法 public void handleUserRequest(String selectedDesc) { QueryConfig config = QUERY_CONFIG_MAP.get(selectedDesc); if (config == null) { // 处理无效描述的情况 return; } switch (config.getOperationType()) { case "SEARCH": // 执行搜索逻辑:用config.getSql()查询数据库 executeSearch(config.getSql()); break; case "UPDATE": // 执行更新逻辑 executeUpdate(config.getSql()); break; case "DOWNLOAD": // 调用已有的下载功能,传入filename downloadFile(config.getFilename()); break; } }
补充说明
- XML结构只要能对应上解析逻辑即可,比如示例中假设的结构:
<queries> <query> <description value="Flusso VLT mensile"/> <operation>DOWNLOAD</operation> <sql>SELECT * FROM vlt_monthly</sql> <filename>vlt_monthly_report.csv</filename> </query> <!-- 其他查询节点 --> </queries>
- 映射表在项目启动时加载一次,避免重复IO操作,提升性能。
内容的提问来源于stack exchange,提问作者Robs
相关产品推荐
相关产品推荐

