xml格式轉換


  最近接到授權遷移的任務,需要將原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

  建議一定要想好寫什么標題,或者說關鍵字才能盡可能准確快速的找到解決方案。嘎嘎


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM