使用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>

猜你喜欢

转载自www.cnblogs.com/wang-liang-blogs/p/11131522.html