首页 > 编程知识 正文

写xml文件的工具,xml生成器

时间:2023-05-04 23:31:37 阅读:240102 作者:1491

XML文件生成工具

网上找了很多生成xml文件的代码,在文件比较简单的时候还可以,一旦嵌套层级比较深的时候就不行了。自己采用jdom实现了如下的版本。

将xml文件中每一个标签当做一个节点,该节点除name外还有可扩展的多个属性,该标签的值(可能是一个字符或数字,也可能是多个子节点)。

节点实体类 class XMLDataNode{ private String name; private Map<String, Object> attribute; private List<XMLDataNode> subNodes; private String content; ... }

需要将数据构造成这样的树结构,然后递归遍历

构造xml文件 public static void createXML(XMLDataNode root, String localPath){ Element rootEle = new Element(root.getName()); Map<String, Object> attribute = root.getAttribute(); if(ObjectUtils.isMapNotEmpty(attribute)){ for(String key : attribute.keySet()){ rootEle.setAttribute(key, attribute.get(key).toString()); } } if(StringUtils.isNotEmpty(root.getContent())){ rootEle.setText(root.getContent()); } getXmlFromList(rootEle, root.getSubNodes()); Document doc = new Document(rootEle); Format format = Format.getPrettyFormat(); XMLOutputter xmlOutputter = new XMLOutputter(format); File file = new File(localPath); try { OutputStream out = new FileOutputStream(file); xmlOutputter.output(doc, out); } catch (Exception e) { e.printStackTrace(); } } 递归构造子节点 public static void getXmlFromList(Element root,List<XMLDataNode> subList) { if(ObjectUtils.isListNotEmpty(subList)) { for (XMLDataNode dataNode : subList) { Element element = new Element(dataNode.getName()); Map<String, Object> param = dataNode.getAttribute(); if (ObjectUtils.isMapNotEmpty(param)) { for (String key : param.keySet()) { element.setAttribute(key, param.get(key).toString()); } } if(StringUtils.isNotEmpty(dataNode.getContent())){ element.setText(dataNode.getContent()); } root.addContent(element); getXmlFromList(element, dataNode.getSubNodes()); } } } 举一个栗子 public static void main(String[] args) { XMLDataNode dataNode = new XMLDataNode(); dataNode.setName("eventTypes"); List<XMLDataNode> abilityList = new ArrayList<>(); XMLDataNode abilityNode = new XMLDataNode(); abilityNode.setName("ability"); Map<String, Object> attribute = new LinkedHashMap<>(); attribute.put("comId", "abc"); attribute.put("type","event_abc"); attribute.put("expression", "abc.eventtype.ability.name.hhh"); abilityNode.setAttribute(attribute); List<XMLDataNode> resTypeList = new ArrayList<>(); XMLDataNode resTypeNode = new XMLDataNode(); resTypeNode.setName("resType"); Map<String, Object> restTypeAttribute = new LinkedHashMap<>(); restTypeAttribute.put("type", "model"); restTypeAttribute.put("privilegeCode", "view"); restTypeAttribute.put("dataSrc",""); restTypeAttribute.put("expression", ""); restTypeAttribute.put("dataUrl",""); restTypeAttribute.put("linkageResourceModel", "dialogTriple"); resTypeNode.setAttribute(restTypeAttribute); List<XMLDataNode> groupList = new ArrayList<>(); XMLDataNode groupNode = new XMLDataNode(); groupNode.setName("eventTypeGroup"); Map<String, Object> groupNodeAttribute = new LinkedHashMap<>(); groupNodeAttribute.put("type", "base"); groupNodeAttribute.put("expression", "abc.eventtype.efg.group.fff"); groupNodeAttribute.put("display", "true"); groupNode.setAttribute(groupNodeAttribute); List<XMLDataNode> eventTypeList = new ArrayList<>(); XMLDataNode eventTypeNode = new XMLDataNode(); eventTypeNode.setName("eventType"); eventTypeNode.setContent("1120001"); Map<String, Object> eventTypeAttribute = new LinkedHashMap<>(); eventTypeAttribute.put("order", "1"); eventTypeAttribute.put("expression", "abc.eventtype.efg.group.fff.1120001"); eventTypeNode.setAttribute(eventTypeAttribute); XMLDataNode eventTypeNode2 = new XMLDataNode(); eventTypeNode2.setName("eventType"); eventTypeNode2.setContent("1120002"); Map<String, Object> eventTypeAttribute2 = new LinkedHashMap<>(); eventTypeAttribute2.put("order", "2"); eventTypeAttribute2.put("expression", "abc.eventtype.efg.group.fff.1120002"); eventTypeNode2.setAttribute(eventTypeAttribute2); eventTypeList.add(eventTypeNode); eventTypeList.add(eventTypeNode2); groupNode.setSubNodes(eventTypeList); groupList.add(groupNode); resTypeNode.setSubNodes(groupList); resTypeList.add(resTypeNode); abilityNode.setSubNodes(resTypeList); abilityList.add(abilityNode); dataNode.setSubNodes(abilityList); createXML(dataNode, "d://test2.xml"); }

效果展示

感觉这个版本最大的问题是怎么构造数据,以及递归的效率问题。小方也不知道怎么优化了。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。