最近接到授权迁移的任务,需要将原xml的权限表转换成新格式的xml权限表;本来想手动完成xml格式转换,人工将旧权限表的数据转移到新表上,但仔细想了想,数据有点多,这不适合一个懒人;与人工手动实现的思路一样,将实现过程转化为java代码逻辑,实际我们编程的思路也是这样来的,化难为多,变多为简。

原xml权限表数据格式:

<?xml version="1.0" encoding="UTF-8"?>
<rights>
    <item id="1" label="需方功能">
        <tipskey></tipskey>
        <parent></parent>
        <url></url>
        <icon></icon>
        <license>1</license>
        <display>1</display>
    </item>
</rights>

新xml授权表数据格式:

<?xml version="1.0" encoding="UTF-8"?>
<rights>
    <item id="1" pid="" name="需方功能" url="" icon="" display="1" tag="1" i18n=""/>
</rights>

实现思路:

  读取原xml文件–>根据旧权限信息拼装新的授权数据格式–>写入新的xml文件

代码:

import java.io.File;
import java.io.FileWriter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

/**
 * xml格式化转换
 * @author wang-xiaoming
 *
 */
public class TestXml {
    @SuppressWarnings("unchecked")
    public static void main(String[] args) throws DocumentException {
        /*
         * 读取文件
         */
        //1.创建SAXReader对象用于读取xml文件
        SAXReader reader = new SAXReader();
        //2.读取xml文件,获得Document对象
        Document doc = reader.read(new File("D:/share/xiaoming/项目/供需社 1.8/rights.xml"));
        //3.获取根元素
        Element root = doc.getRootElement();
        //4.获取根元素下的所有子元素(通过迭代器)
        Iterator<Element> it = root.elementIterator();
        List<Item> items = new ArrayList<>(16);
        
        while(it.hasNext()){
            Element e = it.next();
            //获取id属性(attribute是属性的意思)
            Attribute id = e.attribute("id");
            Attribute label = e.attribute("label");
            Element parent = e.element("parent");
            Element display = e.element("display");
            
            Item item = new Item();
            // 权限码
            item.setId(id.getStringValue());
            // 父权限码
            item.setPid(parent.getStringValue());
            // 名称
            item.setName(label.getStringValue());
            // 超级链接(用于菜单)
            item.setUrl("");
            // 图标
            item.setIcon("");
            // 0不显示 1显示(用于菜单)
            item.setDisplay(display.getStringValue());
            // 用于版本升级(暂时不用)
            item.setTag("1");
            // 国际化key
            item.setI18n("");
            // 标签
            item.setLable(label.getStringValue());
            
            items.add(item);
            // System.out.println("id:" + id.getStringValue() + ",lable:" + label.getStringValue() + ",parent:" + parent.getStringValue());
        }
        System.out.println("---------------------------------------------------------------");
        
        // <!-- id:权限码,pid:父权限码,name:名称,url:超级链接(用于菜单),icon:图标,display:0不显示 1显示(用于菜单),tag:用于版本升级(暂时不用),i18n:国际化key, lable:功能说明标签-->
        // 格式:<item id="170701" pid="1707" name="流程定制" url="" icon="" display="1" tag="1" i18n="" lable=""/>
        /*
         * 写入文件
         */
        Document newDoc = DocumentHelper.createDocument();
        Element ele = newDoc.addElement("rights");
        for (Item item : items) {
            Element itemEle = ele.addElement("item");
            itemEle.addAttribute("id", item.getId());
            itemEle.addAttribute("pid", item.getPid());
            itemEle.addAttribute("name", item.getName());
            itemEle.addAttribute("url", item.getUrl());
            itemEle.addAttribute("icon", item.getIcon());
            itemEle.addAttribute("display", item.getDisplay());
            itemEle.addAttribute("tag", item.getTag());
            itemEle.addAttribute("i18n", item.getI18n());
            try {
                XMLWriter writer = new XMLWriter(new FileWriter(new File("D:/share/xiaoming/项目/供需社 1.8/rightsNew.xml")));
                writer.write(newDoc);
                writer.close();
            } catch (Exception e) {
            }
        }
        
        System.out.println("新的xml权限文件已生成!一共转换了" + items.size() + "条数据。");
    }
}

class Item{
    /**
     * 权限码
     */
    private String id;
    /**
     * 父权限码
     */
    private String pid;
    /**
     * 名称
     */
    private String name;
    /**
     * 超级链接(用于菜单)
     */
    private String url;
    /**
     * 图标
     */
    private String icon;
    /**
     * 0不显示 1显示(用于菜单)
     */
    private String display;
    /**
     * 用于版本升级(暂时不用)
     */
    private String tag;
    /**
     * 国际化key
     */
    private String i18n;
    /**
     * 标签
     */
    private String lable;
    
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getPid() {
        return pid;
    }
    public void setPid(String pid) {
        this.pid = pid;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getUrl() {
        return url;
    }
    public void setUrl(String url) {
        this.url = url;
    }
    public String getIcon() {
        return icon;
    }
    public void setIcon(String icon) {
        this.icon = icon;
    }
    public String getDisplay() {
        return display;
    }
    public void setDisplay(String display) {
        this.display = display;
    }
    public String getTag() {
        return tag;
    }
    public void setTag(String tag) {
        this.tag = tag;
    }
    public String getI18n() {
        return i18n;
    }
    public void setI18n(String i18n) {
        this.i18n = i18n;
    }
    public String getLable() {
        return lable;
    }
    public void setLable(String lable) {
        this.lable = lable;
    }
    
}

  打开生成的新格式的xml文件发现,xml的属性都挤到了同一行,本来想在代码里完成换行操作,坚持而不懈的懒下去。然后搜到了这边文章‘使用Java生成XML文件时,如何能让文件自动换行?’(评论是重点),原话如下,

不换行才是正确的XML格式写法,因为换行的时候,从换行处到下一行字符开始,中间的部分也算是一个节点!
如果你的xml要保存成文件,仅仅是为了看起来方便,建议用工具格式化就行!

  一语点醒搬砖人啊!

  接下来就简单了,找个格式化工具,一键格式化,搞定!

参考资料如下:

第一步:读取xml文件:https://www.cnblogs.com/chengmuzhe/p/10127895.html
第二步:写入xml文件:https://www.cnblogs.com/cstdio1/p/11627726.html
第三步:java写入xml文件时换行:https://zhidao.baidu.com/question/872098701511361012.html
第四步:xml换行格式化工具:https://www.sojson.com/xml.html

  建议一定要想好写什么标题,或者说关键字才能尽可能准确快速的找到解决方案。嘎嘎

版权声明:本文为huakaiyoushi原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/huakaiyoushi/p/14519700.html