New file |
| | |
| | | package com.dy.common.util; |
| | | |
| | | import org.jdom2.Document; |
| | | import org.jdom2.Element; |
| | | import org.jdom2.input.SAXBuilder; |
| | | import org.jdom2.output.Format; |
| | | import org.jdom2.output.XMLOutputter; |
| | | |
| | | import java.io.FileWriter; |
| | | import java.net.URL; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * @Author: liurunyu |
| | | * @Date: 2024/8/21 15:27 |
| | | * @Description |
| | | */ |
| | | public class ConfigXml { |
| | | |
| | | /** |
| | | * 创建Document对象 |
| | | * @param configFileURL 配置文件路径 |
| | | * @return 返回结果 返回结果返回 doc对象 |
| | | * @throws Exception 抛出异常 抛出异常 |
| | | */ |
| | | protected Document doCreateDom(URL configFileURL) throws Exception { |
| | | if (configFileURL == null) { |
| | | throw new Exception("没有得到配置文件!", null); |
| | | } |
| | | Document doc; |
| | | try { |
| | | SAXBuilder sb = new SAXBuilder(); |
| | | doc = sb.build(configFileURL); |
| | | if (doc == null) { |
| | | throw new Exception("没有生成配置文件的DOM对象!", null); |
| | | } |
| | | } catch (Exception e) { |
| | | throw new Exception("生成配置文件的DOM对象失败!", e); |
| | | } |
| | | return doc; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 保存xml文件 |
| | | * @param clazz 参考类 |
| | | * @param doc doc对象 doc对象 |
| | | * @param filePath 配置文件路径 |
| | | * @throws Exception 抛出异常 抛出异常 |
| | | */ |
| | | public void saveXML(Class<?> clazz, Document doc, String filePath) throws Exception { |
| | | if(doc == null){ |
| | | throw new Exception("Document对象为空!"); |
| | | } |
| | | if(filePath == null || filePath.equals("")){ |
| | | throw new Exception("配置文件路径名称为空!"); |
| | | } |
| | | if(!filePath.startsWith("/")){ |
| | | filePath = "/" + filePath ; |
| | | } |
| | | // 将doc对象输出到文件 |
| | | FileWriter writer = null ; |
| | | try { |
| | | // 创建xml文件输出流 |
| | | XMLOutputter xmlopt = new XMLOutputter(); |
| | | // 创建文件输出流 |
| | | URL configFileURL = clazz.getResource(filePath); |
| | | if (configFileURL == null) { |
| | | throw new Exception("没有得到" + filePath + "配置!"); |
| | | } |
| | | writer = new FileWriter(configFileURL.getPath()); |
| | | // 指定文档格式 |
| | | Format fm = Format.getPrettyFormat(); |
| | | fm.setEncoding("UTF-8"); |
| | | xmlopt.setFormat(fm); |
| | | // 将doc写入到指定的文件中 |
| | | xmlopt.output(doc, writer); |
| | | } catch (Exception e) { |
| | | throw new Exception("保存xml文件失败!", e); |
| | | } finally { |
| | | if(writer != null){ |
| | | writer.close(); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 检查元素是否存在 |
| | | * @param doc doc对象 |
| | | * @param elementName 元素名称 |
| | | * @return 返回结果 返回结果 |
| | | */ |
| | | public Element getElement(Document doc, String elementName){ |
| | | if(doc == null){ |
| | | return null ; |
| | | } |
| | | if(elementName == null){ |
| | | return null ; |
| | | } |
| | | elementName = elementName.trim() ; |
| | | if(elementName.equals("")){ |
| | | return null ; |
| | | } |
| | | return this.get_element(doc, elementName) ; |
| | | } |
| | | |
| | | /** |
| | | * 检查元素是否存在 |
| | | * @param doc doc对象 |
| | | * @param elementName 元素名称 |
| | | * @return 返回结果 返回结果 |
| | | */ |
| | | public boolean existElement(Document doc, String elementName){ |
| | | if(doc == null){ |
| | | return false ; |
| | | } |
| | | if(elementName == null){ |
| | | return false ; |
| | | } |
| | | elementName = elementName.trim() ; |
| | | if(elementName.equals("")){ |
| | | return false ; |
| | | } |
| | | Element e = this.get_element(doc, elementName) ; |
| | | return e != null; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 得到并设置元素的属性的布尔值 |
| | | * @param doc doc对象 |
| | | * @param elementName 元素名称 |
| | | * @param attrName 属性名称 |
| | | * @param attPropertyNameFix 属性名称前缀 |
| | | * @param setValue 同时设置值 |
| | | * @return 返回结果 |
| | | * @throws Exception 抛出异常 |
| | | */ |
| | | public boolean getSetAttrBoolean(Document doc, String elementName, String attrName, String attPropertyNameFix, String setValue) throws Exception{ |
| | | String txt = this.getSetAttrTxt(doc, elementName, attrName, attPropertyNameFix, false, setValue) ; |
| | | return txt.equalsIgnoreCase("true"); |
| | | } |
| | | |
| | | /** |
| | | * 得到并设置元素的属性的布尔值 |
| | | * @param e 元素对象 |
| | | * @param attrName 属性名称 |
| | | * @param attPropertyNameFix 属性名称前缀 |
| | | * @param setValue 同时设置值 |
| | | * @return 返回结果 |
| | | * @throws Exception 抛出异常 |
| | | */ |
| | | public boolean getSetAttrBoolean(Element e, String attrName, String attPropertyNameFix, String setValue) throws Exception{ |
| | | String txt = this.getSetAttrTxt(e, attrName, attPropertyNameFix, false, setValue) ; |
| | | return txt.equalsIgnoreCase("true"); |
| | | } |
| | | |
| | | /** |
| | | * 得到并设置元素的属性的字符串值 |
| | | * @param doc doc对象 |
| | | * @param elementName 元素名称 |
| | | * @param attrName 属性名称 |
| | | * @param attPropertyNameFix 属性名称前缀 |
| | | * @param canBlank 是否可为空 |
| | | * @param setValue 同时设置值 |
| | | * @return 返回结果 |
| | | * @throws Exception 抛出异常 |
| | | */ |
| | | public String getSetAttrTxt(Document doc, String elementName, String attrName, String attPropertyNameFix, Boolean canBlank, String setValue) throws Exception{ |
| | | Element e = this.check_and_get_element(doc, elementName); |
| | | return this.getSetAttrTxt(e, attrName, attPropertyNameFix, canBlank, setValue) ; |
| | | } |
| | | |
| | | /** |
| | | * 得到并设置元素的属性的字符串值 |
| | | * @param e 元素对象 |
| | | * @param attrName 属性名称 |
| | | * @param attPropertyNameFix 属性名称前缀 |
| | | * @param canBlank 是否可为空 |
| | | * @param setValue 同时设置值 |
| | | * @return 返回结果 |
| | | * @throws Exception 抛出异常 |
| | | */ |
| | | public String getSetAttrTxt(Element e, String attrName, String attPropertyNameFix, Boolean canBlank, String setValue) throws Exception{ |
| | | String txt = this.check_get_set_Attribute(e, e.getName(), attrName, attPropertyNameFix, setValue) ; |
| | | if(!canBlank){ |
| | | if(txt.trim().equals("")){ |
| | | throw new Exception("元素" + e.getName() + "的属性" + attrName + "的值为空字符串!"); |
| | | } |
| | | } |
| | | return txt.trim() ; |
| | | } |
| | | /** |
| | | * 得到并设置元素的属性的正整数值 |
| | | * @param doc doc对象 |
| | | * @param elementName 元素名称 |
| | | * @param attrName 属性名称 |
| | | * @param attPropertyNameFix 属性名称前缀 |
| | | * @param min 最小值 |
| | | * @param max 最大值 |
| | | * @param setValue 同时设置值 |
| | | * @return 返回结果 |
| | | * @throws Exception 抛出异常 |
| | | */ |
| | | public Integer getSetAttrPlusInt(Document doc, String elementName, String attrName, String attPropertyNameFix, Integer min, Integer max, String setValue) throws Exception{ |
| | | Element e = this.check_and_get_element(doc, elementName); |
| | | return this.getSetAttrPlusInt(e, attrName, attPropertyNameFix, min, max, setValue) ; |
| | | } |
| | | |
| | | /** |
| | | * 得到并设置元素的属性的正整数值 |
| | | * @param e 元素对象 |
| | | * @param attrName 属性名称 |
| | | * @param attPropertyNameFix 属性名称前缀 |
| | | * @param min 最小值 |
| | | * @param max 最大值 |
| | | * @param setValue 同时设置值 |
| | | * @return 返回结果 |
| | | * @throws Exception 抛出异常 |
| | | */ |
| | | public Integer getSetAttrPlusInt(Element e, String attrName, String attPropertyNameFix, Integer min, Integer max, String setValue) throws Exception{ |
| | | int v ; |
| | | String txt = this.check_get_set_Attribute(e, e.getName(), attrName, attPropertyNameFix, setValue) ; |
| | | if(!NumUtil.isPlusIntNumber(txt)){ |
| | | throw new Exception("元素" + e.getName() + "的属性" + attrName + "的值不是正整数!"); |
| | | } |
| | | v = Integer.parseInt(txt); |
| | | if(min != null && v < min){ |
| | | throw new Exception("元素" + e.getName() + "的属性" + attrName + "的值小于" + min + "!"); |
| | | } |
| | | if(max != null && v > max){ |
| | | throw new Exception("元素" + e.getName() + "的属性" + attrName + "的值大于" + max + "!"); |
| | | } |
| | | return v ; |
| | | } |
| | | |
| | | /** |
| | | * 得到并设置元素的属性的整数值 |
| | | * @param doc doc对象 |
| | | * @param elementName 元素名称 |
| | | * @param attrName 属性名称 |
| | | * @param attPropertyNameFix 属性名称前缀 |
| | | * @param min 最小值 |
| | | * @param max 最大值 |
| | | * @param setValue 同时设置值 |
| | | * @return 返回结果 |
| | | * @throws Exception 抛出异常 |
| | | */ |
| | | public Integer getSetAttrInt(Document doc, String elementName, String attrName, String attPropertyNameFix, Integer min, Integer max, String setValue) throws Exception{ |
| | | Element e = this.check_and_get_element(doc, elementName); |
| | | return this.getSetAttrInt(e, attrName, attPropertyNameFix, min, max, setValue) ; |
| | | } |
| | | |
| | | /** |
| | | * 得到并设置元素的属性的整数值 |
| | | * @param e 元素对象 |
| | | * @param attrName 属性名称 |
| | | * @param attPropertyNameFix 属性名称前缀 |
| | | * @param min 最小值 |
| | | * @param max 最大值 |
| | | * @param setValue 同时设置值 |
| | | * @return 返回结果 |
| | | * @throws Exception 抛出异常 |
| | | */ |
| | | public Integer getSetAttrInt(Element e, String attrName, String attPropertyNameFix, Integer min, Integer max, String setValue) throws Exception{ |
| | | int v ; |
| | | String txt = this.check_get_set_Attribute(e, e.getName(), attrName, attPropertyNameFix, setValue) ; |
| | | if(!NumUtil.isIntNumber(txt)){ |
| | | throw new Exception("元素" + e.getName() + "的属性" + attrName + "的值不是正整数!"); |
| | | } |
| | | v = Integer.parseInt(txt) ; |
| | | if(min != null && v < min){ |
| | | throw new Exception("元素" + e.getName() + "的属性" + attrName + "的值小于" + min + "!"); |
| | | } |
| | | if(max != null && v > max){ |
| | | throw new Exception("元素" + e.getName() + "的属性" + attrName + "的值大于" + max + "!"); |
| | | } |
| | | return v ; |
| | | } |
| | | |
| | | /** |
| | | * 得到并设置元素的属性的浮点数值 |
| | | * @param doc doc对象 |
| | | * @param elementName 元素名称 |
| | | * @param attrName 属性名称 |
| | | * @param min 最小值 |
| | | * @param max 最大值 |
| | | * @param setValue 同时设置值 |
| | | * @return 返回结果 |
| | | * @throws Exception 抛出异常 |
| | | */ |
| | | public Double getSetAttrPlusDouble(Document doc, String elementName, String attrName, String attPropertyNameFix, Double min, Double max, String setValue) throws Exception{ |
| | | Element e = this.check_and_get_element(doc, elementName); |
| | | return this.getSetAttrPlusDouble(e, attrName, attPropertyNameFix, min, max, setValue) ; |
| | | } |
| | | |
| | | /** |
| | | * 得到并设置元素的属性的正浮点数值 |
| | | * @param e 元素对象 |
| | | * @param attrName 属性名称 |
| | | * @param attPropertyNameFix 属性名称前缀 |
| | | * @param min 最小值 |
| | | * @param max 最大值 |
| | | * @param setValue 同时设置值 |
| | | * @return 返回结果 |
| | | * @throws Exception 抛出异常 |
| | | */ |
| | | public Double getSetAttrPlusDouble(Element e, String attrName, String attPropertyNameFix, Double min, Double max, String setValue) throws Exception{ |
| | | double v ; |
| | | String txt = this.check_get_set_Attribute(e, e.getName(), attrName, attPropertyNameFix, setValue) ; |
| | | if(!NumUtil.isPlusDoubleNumber(txt)){ |
| | | throw new Exception("元素" + e.getName() + "的属性" + attrName + "的值不是正浮点数!"); |
| | | } |
| | | v = Double.parseDouble(txt) ; |
| | | if(min != null && v < min){ |
| | | throw new Exception("元素" + e.getName() + "的属性" + attrName + "的值小于" + min + "!"); |
| | | } |
| | | if(max != null && v > max){ |
| | | throw new Exception("元素" + e.getName() + "的属性" + attrName + "的值大于" + max + "!"); |
| | | } |
| | | return v ; |
| | | } |
| | | |
| | | /** |
| | | * 得到并设置元素的属性的浮点数值 |
| | | * @param doc doc对象 |
| | | * @param elementName 元素名称 |
| | | * @param attrName 属性名称 |
| | | * @param attPropertyNameFix 属性名称前缀 |
| | | * @param min 最小值 |
| | | * @param max 最大值 |
| | | * @param setValue 同时设置值 |
| | | * @return 返回结果 |
| | | * @throws Exception 抛出异常 |
| | | */ |
| | | public Double getSetAttrDouble(Document doc, String elementName, String attrName, String attPropertyNameFix, Double min, Double max, String setValue) throws Exception{ |
| | | Element e = this.check_and_get_element(doc, elementName); |
| | | return this.getSetAttrDouble(e, attrName, attPropertyNameFix, min, max, setValue) ; |
| | | } |
| | | |
| | | /** |
| | | * 得到并设置元素的属性的浮点数值 |
| | | * @param e 元素对象 |
| | | * @param attrName 属性名称 |
| | | * @param attPropertyNameFix 属性名称前缀 |
| | | * @param min 最小值 |
| | | * @param max 最大值 |
| | | * @param setValue 同时设置值 |
| | | * @return 返回结果 |
| | | * @throws Exception 抛出异常 |
| | | */ |
| | | public Double getSetAttrDouble(Element e, String attrName, String attPropertyNameFix, Double min, Double max, String setValue) throws Exception{ |
| | | double v ; |
| | | String txt = this.check_get_set_Attribute(e, e.getName(), attrName, attPropertyNameFix, setValue) ; |
| | | if(!NumUtil.isDoubleNumber(txt)){ |
| | | throw new Exception("元素" + e.getName() + "的属性" + attrName + "的值不是正浮点数!"); |
| | | } |
| | | v = Double.parseDouble(txt) ; |
| | | if(min != null && v < min){ |
| | | throw new Exception("元素" + e.getName() + "的属性" + attrName + "的值小于" + min + "!"); |
| | | } |
| | | if(max != null && v > max){ |
| | | throw new Exception("元素" + e.getName() + "的属性" + attrName + "的值大于" + max + "!"); |
| | | } |
| | | return v ; |
| | | } |
| | | /** |
| | | * 得到元素 |
| | | * @param doc doc对象 |
| | | * @param elementName 元素名称 元素名,形如"config.base.test" |
| | | * @return 返回结果 |
| | | */ |
| | | private Element get_element(Document doc, String elementName){ |
| | | Element e = null ; |
| | | Element root ; |
| | | String nm ; |
| | | String[] eNames = elementName.split("\\.") ; |
| | | if(eNames.length > 0){ |
| | | root = doc.getRootElement() ; |
| | | nm = root.getName() ; |
| | | if(nm.equals(eNames[0].trim())){ |
| | | if(eNames.length == 1){ |
| | | e = root ; |
| | | }else{ |
| | | e = this.get_next_element(root, eNames, 1) ; |
| | | } |
| | | } |
| | | } |
| | | return e ; |
| | | } |
| | | |
| | | /** |
| | | * 得到子元素 |
| | | * @param base 上级元素对象 |
| | | * @param eNames 元素名称 |
| | | * @param index 数组下标 |
| | | * @return 返回结果 |
| | | */ |
| | | private Element get_next_element(Element base, String[] eNames, int index){ |
| | | Element e = null ; |
| | | String nm ; |
| | | List<Element> list = base.getChildren() ; |
| | | if(list != null && list.size() >0){ |
| | | for(Element el: list){ |
| | | nm = el.getName() ; |
| | | if(nm.equals(eNames[index].trim())){ |
| | | if(eNames.length == index + 1){ |
| | | e = el ; |
| | | }else{ |
| | | e = this.get_next_element(el, eNames, index + 1) ; |
| | | } |
| | | break ; |
| | | } |
| | | } |
| | | } |
| | | return e ; |
| | | } |
| | | /** |
| | | * 检查并获元素 |
| | | * @param doc doc对象 |
| | | * @param elementName 元素名称 |
| | | * @return 返回结果 |
| | | * @throws Exception 抛出异常 |
| | | */ |
| | | private Element check_and_get_element(Document doc, String elementName)throws Exception{ |
| | | if(doc == null){ |
| | | throw new Exception("配置文件的DOM对象为空!"); |
| | | } |
| | | if(elementName == null){ |
| | | throw new Exception("元素名为空!"); |
| | | } |
| | | elementName = elementName.trim() ; |
| | | if(elementName.equals("")){ |
| | | throw new Exception("元素名为空!"); |
| | | } |
| | | Element e = this.get_element(doc, elementName) ; |
| | | if(e == null){ |
| | | throw new Exception("未得到名称为" + elementName + "的元素!"); |
| | | } |
| | | return e ; |
| | | } |
| | | |
| | | /** |
| | | * 检查并获得并设置属性值 |
| | | * @param e 元素对象 |
| | | * @param elementName 元素名称 |
| | | * @param attrName 属性名称 |
| | | * @param attPropertyNameFix 属性名称前缀 |
| | | * @return 返回结果 |
| | | * @throws Exception 抛出异常 |
| | | */ |
| | | private String check_get_set_Attribute(Element e, String elementName, String attrName, String attPropertyNameFix, String setValue)throws Exception{ |
| | | if(attrName == null){ |
| | | throw new Exception("属性名为空!"); |
| | | } |
| | | attrName = attrName.trim() ; |
| | | if(attrName.equals("")){ |
| | | throw new Exception("属性名为空!"); |
| | | } |
| | | String txt = this.get_set_AttributTxt(e, attrName, attPropertyNameFix, setValue) ; |
| | | if(txt == null){ |
| | | throw new Exception("未得到元素" + elementName + "的属性" + attrName + "的值!"); |
| | | } |
| | | return txt ; |
| | | } |
| | | /** |
| | | * 得到并设置属性配置值 |
| | | * @param e 元素对象 |
| | | * @param attName 属性名称 |
| | | * @param attPropertyNameFix 属性名称前缀 |
| | | * @param setValue 同时设置值 |
| | | * @return 返回结果 |
| | | */ |
| | | private String get_set_AttributTxt(Element e, String attName, String attPropertyNameFix, String setValue){ |
| | | String txt = null ; |
| | | if(e != null && attName != null){ |
| | | attName = attName.trim() ; |
| | | if(!attName.equals("")){ |
| | | txt = e.getAttributeValue(attName) ; |
| | | if(setValue != null){ |
| | | e.setAttribute(attName, setValue) ; |
| | | } |
| | | } |
| | | } |
| | | if(txt != null && txt.startsWith("${") && txt.endsWith("}")){ |
| | | txt = txt.substring(2, txt.length() - 1) ; |
| | | if(attPropertyNameFix != null){ |
| | | txt = txt + attPropertyNameFix ; |
| | | } |
| | | txt = ConfigProperties.getConfig(txt) ; |
| | | } |
| | | return txt ; |
| | | } |
| | | |
| | | } |