最近接到授權遷移的任務,需要將原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
建議一定要想好寫什么標題,或者說關鍵字才能盡可能准確快速的找到解決方案。嘎嘎