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帮助类
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文件的方法