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