使用dom4j处理xml文件
1.项目中加入dom4j的jar
2.基本的读取xml文件为Document对象;将Document对象写入到指定文件中
package com.ricoh.rapp.deploymenttool.util; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; import com.ricoh.rapp.deploymenttool.util.Consts; public class XmlParser { private final static Log logger = LogFactory.getLog(XmlParser.class); /** * Read from xml file. * @param file * @return */ public static Document readXML(File file) { Document document = null; SAXReader saxReader = new SAXReader(); saxReader.setEncoding(Consts.UTF8_ENCODING); if (!file.exists()) { String logInfo = "No device/Cloud Connector registered. File " + file.getName() + " not exists."; logger.debug(logInfo); return null; } try { document = saxReader.read(file); } catch (DocumentException e) { String logInfo = "No device/Cloud Connector registered. File " + file.getName() + " is wrong. "; if (e != null) { logInfo = logInfo + e.toString(); } logger.error(logInfo); return null; } return document; } public static boolean writeXML(Document document, File file) { OutputFormat format = OutputFormat.createPrettyPrint(); format.setEncoding(Consts.UTF8_ENCODING); XMLWriter writer = null; try { writer = new XMLWriter(new FileOutputStream(file), format); writer.write(document); return true; } catch (IOException e) { String logInfo = "Write xml file " + file.getName() + " failed!"; logger.error(logInfo); } finally { if (writer != null) { try { writer.close(); } catch (IOException e) { logger.debug("Close file " + file.getName() + " fialed. " + e.toString()); } } } return false; } }
3.解析xml文件、修改文件、创建xml文件。
package com.ricoh.rapp.deploymenttool.util; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import com.ricoh.rapp.deploymenttool.ui.RSICloudModel; import com.ricoh.rapp.deploymenttool.ui.RSICloudModel.FunctionKey; import com.ricoh.rapp.deploymenttool.ui.RSICloudModel.FunctionKeyOptions; import com.ricoh.rapp.deploymenttool.util.Consts; import com.ricoh.rapp.deploymenttool.util.XmlParser; public class RSICloudXmlParser extends XmlParser{ private static final Log logger = LogFactory.getLog(RSICloudXmlParser.class); private static final File file = new File(Consts.RSICLOUD_FILE_PATH); private static final File initialFile = new File(Consts.RSICLOUD_INITIAL_FILE_PATH); public static final String initialUrl = "https://www.na.smart-integration.ricoh.com/si-apps/pub/index.html"; private static final String ELEMENT_ROOT = "root"; private static final String ELEMENT_FUNCTIONKEY_SETTINGS = "FunctionKeySettings"; private static final String ELEMENT_FUNCASSIGN = "FuncAssign"; private static final String ELEMENT_DISPLAY = "Display"; private static final String ELEMENT_FUNCKEYS = "FuncKeys"; private static final String ELEMENT_FUNC = "Func"; private static final String ELEMENT_WEBBROWSER_NXSETTINGS = "WebBrowserNXSettings"; private static final String ELEMENT_HOMEPAGE = "HomePage"; private static final String ATTR_ENABLED = "enabled"; private static final String ATTR_ID = "id"; private static final String ATTR_SELECTED = "selected"; private static final String ATTR_VALUE_TRUE = "true"; private static final String ATTR_VALUE_FALSE = "false"; public static RSICloudModel parseRSICloudXML(){ logger.info("parseRSICloudXML file: " + initialFile.getName()); logger.info("parseRSICloudXML file: " + file.getName()); Document document = null; if(file.exists()) { document = readXML(file); }else { document = readXML(initialFile); } return xmlFileToBean(document); } public static RSICloudModel resetParseRSICloudXML(){ logger.info("parseRSICloudXML file: " + initialFile.getName()); Document document = readXML(initialFile); return xmlFileToBean(document); } private static RSICloudModel xmlFileToBean(Document document) { RSICloudModel rsiCloud = new RSICloudModel(); if(document == null) { return rsiCloud; } Element root = document.getRootElement(); if(root == null) { return rsiCloud; } Element fkSettingsEle = root.element(ELEMENT_FUNCTIONKEY_SETTINGS); Element wbSettingsEle = root.element(ELEMENT_WEBBROWSER_NXSETTINGS); if (fkSettingsEle == null && wbSettingsEle == null) { return rsiCloud; } String fkEnabled = fkSettingsEle.attributeValue(ATTR_ENABLED); rsiCloud.setFunctionKeySettings(stringToBln(fkEnabled)); List<FunctionKey> functionKeys = new ArrayList<>(); for(Iterator rsiCloudsIterator = fkSettingsEle.elementIterator(ELEMENT_FUNCASSIGN); rsiCloudsIterator.hasNext();) { Element funcAssignEle = (Element) rsiCloudsIterator.next(); FunctionKey FunctionKey = rsiCloud.new FunctionKey(); String id = funcAssignEle.attributeValue(ATTR_ID); String isSelected = funcAssignEle.attributeValue(ATTR_SELECTED); String dispalyName = funcAssignEle.element(ELEMENT_DISPLAY).getText(); FunctionKey.setId(Integer.parseInt(id)); FunctionKey.setFuncAssign(stringToBln(isSelected)); FunctionKey.setDispalyName(dispalyName); List<FunctionKeyOptions> functionKeyOptions = new LinkedList<>(); for(Iterator funcIterator = funcAssignEle.element(ELEMENT_FUNCKEYS).elementIterator(ELEMENT_FUNC); funcIterator.hasNext();) { Element funcEle = (Element) funcIterator.next(); FunctionKeyOptions functionKeyOption = rsiCloud.new FunctionKeyOptions(); String selectedOpt = funcEle.attributeValue(ATTR_SELECTED); String optValue = funcEle.getText(); functionKeyOption.setSelected(stringToBln(selectedOpt)); functionKeyOption.setChoiceValues(optValue); functionKeyOptions.add(functionKeyOption); } FunctionKey.setFunctionKeyOptions(functionKeyOptions); functionKeys.add(FunctionKey); } rsiCloud.setFunctionKeys(functionKeys); String wbEnabled = wbSettingsEle.attributeValue(ATTR_ENABLED); rsiCloud.setWebBrowserNXSettings(stringToBln(wbEnabled)); String homePageUrl = wbSettingsEle.element(ELEMENT_HOMEPAGE).getText(); rsiCloud.setHomePageUrl(homePageUrl); return rsiCloud; } public static boolean saveCustomSettings(RSICloudModel rsiCloud) { if(file.exists()) { return updateRSICloudXML(rsiCloud); }else { return createRSICloudXml(rsiCloud); } } public static boolean updateRSICloudXML(RSICloudModel rsiCloud) { Document document = readXML(file); if(document == null || rsiCloud == null) { return false; } Element root = document.getRootElement(); Element fkSettingsEle = root.element(ELEMENT_FUNCTIONKEY_SETTINGS); boolean functionKeySettings = rsiCloud.isFunctionKeySettings(); fkSettingsEle.addAttribute(ATTR_ENABLED, booleanToStr(functionKeySettings)); List<FunctionKey> functionKeys = rsiCloud.getFunctionKeys(); for(Iterator rsiCloudsIterator = fkSettingsEle.elementIterator(ELEMENT_FUNCASSIGN); rsiCloudsIterator.hasNext();) { Element funcAssignEle = (Element) rsiCloudsIterator.next(); int id = Integer.parseInt(funcAssignEle.attributeValue(ATTR_ID)); for(FunctionKey functionKey : functionKeys) { if(functionKey.getId() == id) { boolean isSelected = functionKey.isFuncAssign(); funcAssignEle.addAttribute(ATTR_SELECTED, booleanToStr(isSelected)); String displayName = functionKey.getDispalyName().trim(); funcAssignEle.element(ELEMENT_DISPLAY).setText(displayName); for(Iterator funcIterator = funcAssignEle.element(ELEMENT_FUNCKEYS).elementIterator(ELEMENT_FUNC); funcIterator.hasNext();) { Element funcEle = (Element) funcIterator.next(); String funcValue = funcEle.getText(); List<FunctionKeyOptions> functionKeyOptions = functionKey.getFunctionKeyOptions(); for(FunctionKeyOptions functionKeyOption : functionKeyOptions) { if(functionKeyOption.isSelected() && funcValue.trim().equals(functionKeyOption.getChoiceValues().trim())) { funcEle.addAttribute(ATTR_SELECTED, booleanToStr(true)); } if(!functionKeyOption.isSelected() && funcValue.trim().equals(functionKeyOption.getChoiceValues().trim())) { funcEle.remove(funcEle.attribute(ATTR_SELECTED)); } } } } } } Element wbSettingsEle = root.element(ELEMENT_WEBBROWSER_NXSETTINGS); boolean webBrowserSetting = rsiCloud.isWebBrowserNXSettings(); wbSettingsEle.addAttribute(ATTR_ENABLED, booleanToStr(webBrowserSetting)); String homePageUrl = rsiCloud.getHomePageUrl(); wbSettingsEle.element(ELEMENT_HOMEPAGE).setText(homePageUrl); writeXML(document, file); return true; } private static boolean createRSICloudXml(RSICloudModel rsiCloud) { if(file.isFile() && file.exists()) { return true; }else { try { file.createNewFile(); } catch (IOException e) { logger.error("createRSICloudXml failed:File name: " + file.getName() + ", File path:" + file.getAbsolutePath() + ", IOException:" + e.getMessage()); } } if(rsiCloud == null) return false; Document document = DocumentHelper.createDocument(); Element root = document.addElement(ELEMENT_ROOT); Element fkSettingsEle = root.addElement(ELEMENT_FUNCTIONKEY_SETTINGS); if(rsiCloud.isFunctionKeySettings()) { fkSettingsEle.addAttribute(ATTR_ENABLED, ATTR_VALUE_TRUE); }else { fkSettingsEle.addAttribute(ATTR_ENABLED, ATTR_VALUE_FALSE); } for(FunctionKey functionKey : rsiCloud.getFunctionKeys()) { Element funcAssignEle = fkSettingsEle.addElement(ELEMENT_FUNCASSIGN); funcAssignEle.addAttribute(ATTR_ID, String.valueOf(functionKey.getId())); funcAssignEle.addAttribute(ATTR_SELECTED, ATTR_VALUE_TRUE); if(functionKey.isFuncAssign()) { funcAssignEle.addAttribute(ATTR_SELECTED, ATTR_VALUE_TRUE); }else { funcAssignEle.addAttribute(ATTR_SELECTED, ATTR_VALUE_FALSE); } Element displayEle = funcAssignEle.addElement(ELEMENT_DISPLAY); displayEle.setText(functionKey.getDispalyName()); Element funcKeysEle = funcAssignEle.addElement(ELEMENT_FUNCKEYS); for(FunctionKeyOptions functionKeyOption :functionKey.getFunctionKeyOptions()) { Element funcEle = funcKeysEle.addElement(ELEMENT_FUNC); funcEle.setText(functionKeyOption.getChoiceValues()); if(functionKeyOption.isSelected()) funcEle.addAttribute(ATTR_SELECTED, ATTR_VALUE_TRUE); } } Element webBrowSettingsEle = root.addElement(ELEMENT_WEBBROWSER_NXSETTINGS); if(rsiCloud.isWebBrowserNXSettings()) { webBrowSettingsEle.addAttribute(ATTR_ENABLED, ATTR_VALUE_TRUE); }else { webBrowSettingsEle.addAttribute(ATTR_ENABLED, ATTR_VALUE_FALSE); } Element homePageEle = webBrowSettingsEle.addElement(ELEMENT_HOMEPAGE); homePageEle.setText(rsiCloud.getHomePageUrl()); return writeXML(document, file); } public static boolean stringToBln(String str) { if(str != null && ATTR_VALUE_TRUE.equals(str.trim())) { return true; } return false; } public static String booleanToStr(boolean bln) { if(bln) { return ATTR_VALUE_TRUE; }else { return ATTR_VALUE_FALSE; } } public static void main(String[] args) throws IOException { /*RSICloudModel rsiCloud = RSICloudXmlParser.parseRSICloudXML(); for(FunctionKey functionKey: rsiCloud.getFunctionKeys()) { if(functionKey.getId() == 0) { functionKey.getFunctionKeyOptions().toArray(); } }*/ // createRSICloudXml(null); System.out.println(initialUrl); } }
3.自定义xml文件实例
<?xml version="1.0" encoding="UTF-8"?> <root> <FunctionKeySettings enabled="false"> <FuncAssign id="0" selected="true"> <Display>Display node value</Display> <FuncKeys> <Func/> <Func>func node value1</Func> <Func>func node value2</Func> <Func selected="true">func node value3</Func> <Func>func node value4</Func> </FuncKeys> </FuncAssign> <FuncAssign id="1" selected="true"> <Display>Display node value3</Display> <FuncKeys> <Func/> <Func>func node value1</Func> <Func>func node value2</Func> <Func>func node value3</Func> <Func>func node value4</Func> <Func selected="true">func node value5</Func> </FuncKeys> </FuncAssign> <FuncAssign id="2" selected="false"> <Display></Display> <FuncKeys> <Func selected="true"/> <Func>func node value1</Func> <Func>func node value2</Func> <Func>func node value3</Func> <Func>func node value4</Func> <Func>func node value5</Func> <Func>func node value6</Func> </FuncKeys> </FuncAssign> </FunctionKeySettings> <WebBrowserNXSettings enabled="true"> <HomePage>https://www.baidu.com</HomePage> </WebBrowserNXSettings> </root>