XML生成本地文件和xml字符串
XML实体类
import java.util.HashMap; public class XmlFormat { //根节点名称 private String rootName; //层级节点 名称/值 (值可为空。当值为空时,代表节点下带有属性节点。 当值不等于空时,代表该节点直接包含内容,没有属性节点) private HashMap<String, Object> multiplyNames; //属性节点 名称/值 private HashMap<String, Object> propertyNames; /**构造函数 * 参数: 根节点名称 * */ public XmlFormat(String rootName){ this.rootName = rootName; this.multiplyNames = new HashMap<String, Object>(); this.propertyNames = new HashMap<String, Object>(); } public String getRootName() { return rootName; } public void setRootName(String rootName) { this.rootName = rootName; } public HashMap<String, Object> getMultiplyNames() { return multiplyNames; } public void setMultiplyNames(HashMap<String, Object> multiplyNames) { this.multiplyNames = multiplyNames; } public HashMap<String, Object> getPropertyNames() { return propertyNames; } public void setPropertyNames(HashMap<String, Object> propertyNames) { this.propertyNames = propertyNames; } /**(重载)用于xml层级节点键/值(没有属性节点) * 参数: 层级节点名称, 层级节点的值 * */ public void setElement(String multiplyName, String multiplyValue) { this.multiplyNames.put(multiplyName, multiplyValue); } /**(重载)用于xml层级节点,属性节点 * 参数: 层级节点名称, 属性节点键/值 * */ public void setElement(String multiplyName, HashMap<String, Object> propertyNames) { this.multiplyNames.put(multiplyName, null); this.propertyNames = propertyNames; } /** * getter / setter * */ }
XML帮助类
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.List; import java.util.Map.Entry; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document; import org.w3c.dom.Element; public class XmlHandler { //整个xml的节点数据(把设置的每个层级XmlFormat都添加到这个集合中) public List<XmlFormat> documentElements = new ArrayList<XmlFormat>(); /** 生成Dom树 * 返回Document(整个Dom Tree) * */ private Document createDom(){ DocumentBuilderFactory factory = null; DocumentBuilder builder = null; Document document = null; try { factory = DocumentBuilderFactory.newInstance(); //创建DocumentBuilderFactory工厂对象 builder = factory.newDocumentBuilder(); //通过工厂对象, 创建DocumentBuilder制作对象 document = builder.newDocument(); //通过制作对象, 创建一个Document对象,该对象代表一个XML文件 document.setXmlStandalone(true); //设置XMLstandalone, true为没有dtd和schema作为该XML的说明文档 //创建根节点 Element root = document.createElement(documentElements.get(0).getRootName()); document.appendChild(root); //循环创建整个DOM树 for(int i = 0; i < documentElements.size(); i++){ XmlFormat format = documentElements.get(i); //获取xml的一个完整层级 //循环创建层级节点 for(Entry<String, Object> entryMultiply : format.getMultiplyNames().entrySet()){ if(entryMultiply.getValue() != null && !entryMultiply.getValue().toString().equalsIgnoreCase("")){ // 层级节点键/值(没有属性节点) Element multiplyNode = document.createElement(entryMultiply.getKey()); // 创建一个层级节点 multiplyNode.setTextContent(entryMultiply.getValue().toString()); // 设置该层级节点的值 root.appendChild(multiplyNode); } else { // 层级节点键(带有属性节点) Element multiplyNode = document.createElement(entryMultiply.getKey()); // 创建一个层级节点 root.appendChild(multiplyNode); //循环创建属性节点 for(Entry<String, Object> entryProperty : format.getPropertyNames().entrySet()){ Element propertyNode = document.createElement(entryProperty.getKey()); // 创建一个属性节点 propertyNode.setTextContent(entryProperty.getValue().toString()); // 设置该属性节点的值 multiplyNode.appendChild(propertyNode); } root.appendChild(multiplyNode); //设置层级节点到根节点 } } } } catch (Exception e) { e.printStackTrace(); } return document; } /** 生成xml字符串 * 参数: Document树对象 * 返回String: 整个xml字符串 * */ private String createXmlToString(Document document){ String xmlString = null; try { // 创建TransformerFactory工厂对象 TransformerFactory transFactory = TransformerFactory.newInstance(); // 通过工厂对象, 创建Transformer对象 Transformer transformer = transFactory.newTransformer(); transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); //使Xml自动换行, 并自动缩进 transformer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC, ""); transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4"); //中间的参数网址固定写法(这里还没搞懂) transformer.setOutputProperty(OutputKeys.INDENT, "yes"); //是否设置缩进(indent: yes|no) // 创建DOMSource对象并将Document加载到其中 DOMSource domSource = new DOMSource(document); ByteArrayOutputStream bos = new ByteArrayOutputStream(); // 使用Transformer的transform()方法将DOM树转换成XML transformer.transform(domSource, new StreamResult(bos)); xmlString = bos.toString(); } catch (TransformerException e) { e.printStackTrace(); } return xmlString; } /** 生成xml文件 * 参数: url存放文件路径, Document树对象 * 返回String: 反馈信息 * */ private String createXmlToFile(String url, Document document){ String message = null; try{ // 创建TransformerFactory对象 TransformerFactory transFactory = TransformerFactory.newInstance(); // 创建Transformer对象 Transformer transformer = transFactory.newTransformer(); //使Xml自动换行, 并自动缩进 transformer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC, ""); transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4"); //中间的参数网址固定写法(这里还没搞懂) transformer.setOutputProperty(OutputKeys.INDENT, "yes"); //是否设置缩进(indent: yes|no) // 建DOMSource对象并将Document加载到其中 DOMSource domSource = new DOMSource(document); //生成xml文件 File file = new File(url); if (!file.exists()) { //判断文件是否存在 file.createNewFile(); //不存在生存文件 } FileOutputStream out = new FileOutputStream(file); //文件输出流 StreamResult xmlResult = new StreamResult(out); //设置输入源 // 使用Transformer的transform()方法将DOM树转换成XML(参数:DOMSource, 输入源) transformer.transform(domSource, xmlResult); message = "生成本地XML成功!"; }catch(Exception e){ e.printStackTrace(); message = "生成本地XML失败!"; } return message; } /** 接口方法(重载) * 创建Xml字符串 * 返回String: xml字符串 * */ public String createXml(){ String xmlString = null; if(documentElements != null && documentElements.size() > 0){ //判断是否存在xml格式和内容 Document document = createDom(); //调用 生成Dom树 的方法 xmlString = createXmlToString(document); //调用 生成xml字符串 的方法 } return xmlString; } /** 接口方法(重载) * 创建Xml本地文件(参数: 路径) * 返回String: 成功/失败消息 * */ public String createXml(String url){ String xmlMessage = null; if(documentElements != null && documentElements.size() > 0){ //判断是否存在xml格式和内容 Document document = createDom(); //调用 生成Dom树 的方法 xmlMessage = createXmlToFile(url, document); //调用 生成xml文件 的方法 } return xmlMessage; } }
测试调用工具类生成xml字符串
String rootName = "rootXml"; //根节点名称 String multiplyTwo = "multiply"; //层级节点名称 HashMap<String, Object> propertyTwos = new HashMap<String, Object>(); //属性节点集合 propertyTwos.put("name", "Jack"); propertyTwos.put("age", 50); //创建XmlHandler XmlHandler xmlhandler = new XmlHandler(); //创建Xmlformat格式类: 一个Xmlformat为一个层级(以下有两个层级,大家可以回到上面看结果截图) XmlFormat xmlformatOne = new XmlFormat(rootName); //创建xml格式,并传入 根节点名称 XmlFormat xmlformatTwo = new XmlFormat(rootName); //创建xml格式,并传入 根节点名称 // xmlhandler.documentElements.add(xmlformatOne); //把格式XmlFormat, 设置xmlhandler里面的集合 for(int i=0;i<410;i++){ String multiplyOne = "multiply"; //层级节点名称 HashMap<String, Object> propertyOnes = new HashMap<String, Object>(); //属性节点集合 propertyOnes.put("name", "chuck"); propertyOnes.put("age", i); xmlformatOne.setElement(multiplyOne, propertyOnes); //设置层级节点名称 和 属性节点的集合 (setElement为重载方法) xmlhandler.documentElements.add(xmlformatOne); //把格式XmlFormat, 设置xmlhandler里面的集合 } xmlformatTwo.setElement(multiplyTwo, propertyTwos); //设置层级节点名称 和 属性节点的集合(setElement为重载方法) xmlhandler.documentElements.add(xmlformatTwo); //把格式XmlFormat, 设置xmlhandler里面的集合 String xmlString = xmlhandler.createXml(); //调用xmlHandler的接口方法, 获取xml字符串
PS:工具类中有生成xml文件的方法

更多精彩