xml工具类
引入pom:
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
接口
import java.util.List;
import java.util.Map;
import org.dom4j.Element;
public interface BaseXML {
/**
* 创建一个带有一个属性的节点
* @param elementName 节点名称
* @param label 属性名称
* @param value 属性值
* @return
*/
public Element createElement(String elementName,String label,String value);
/**
* 创建一个带有一个属性且内容为context的节点
* @param elementName 节点名称
* @param label 属性名称
* @param value 属性值
* @param context 文本内容
* @return
*/
public Element createElement(String elementName,String label,String value,String context);
/**
* 创建一个带有一系列属性且内容为context的的节点
* @param elementName 节点名称
* @param attrs 所有属性
* @param context 文本内容
* @return
*/
public Element createElement(String elementName,Map<String, String> attrs, String context);
/**
* 创建一个带有一系列属性的节点
* @param elementName 节点名称
* @param attrs 所有属性
* @return
*/
public Element createElement(String elementName,Map<String, String> attrs);
/**
* 指定节点下增加一个节点
* @param target 指定节点
* @param element 增加的节点
* @return
*/
public void addElementInTarget(Element target,Element element);
/**
* 指定节点下增加一个节点
* @param target 指定节点
* @param element 增加的节点
* @return
*/
public Element addElementInTarget(Element target,String elementName,Map<String, String> attrs,String context);
/**
* 根节点下增加一个节点
* @param element 增加的节点
* @return
*/
public void addElement(Element element);
/**
* root下增加一个节点
* @param elementName 节点名称
* @param attrs 属性
* @param context 文本内容
*/
public Element addElementByName(String elementName,Map<String, String> attrs, String context);
/**
* root下增加一个节点
* @param elementName 节点名称
* @param attrs 属性
*/
public Element addElementByName(String elementName,Map<String, String> attrs) ;
/**
* 通过id属性查找指定节点
* @param id
* @return
*/
public Element findElementById(String id);
/**
* 查找所有节点名称为elementName的节点
* @param elementName
* @return
*/
public List<Element> findElementByName(String elementName);
/**
* 通过指定一系列属性查找指定节点
* @param attributes
* @return
*/
public Element findElementByArrributes(Map<String,String> attributes);
/**
* 通过指定一系列属性查找所有节点
* @param attributes
* @return
*/
public List<Element> findAllElementByArrributes(Map<String,String> attributes);
/**
* 加载指定节点的所有子节点
* @param element
* @return
*/
public List<Element> loadSubElement(Element element);
/**
* 查找根节点
* @return
*/
public Element loadRoot();
/**
* 删除指定节点
* @param tar
* @return
*/
public boolean deleteElement(Element tar);
/**
* 删除指定一系列节点
* @param tarlist
* @return
*/
public boolean deleteElement(List<Element> tarlist);
/**
* 删除所有节点名称为elementName的节点
* @param elementName
* @return
*/
public boolean deleteElement(String elementName);
/**
* 删除属性匹配所有attributes的节点
* @param elementName
* @return
*/
public boolean deleteElementByAttributes(Map<String,String> attributes);
/**
* 修改制定节点的属性值,如果存在则覆盖,否则写入
* @param element
* @param attributes
* @return
*/
public void modifyElement(Element element,Map<String,String> attributes,String context);
/**
* 写入文件
* @param filePath
*/
public void writeXml(String filePath);
}
实现类
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
/**
* 操作XML文件的工具类
*
* @author zbc
*/
public class XMLUtil implements BaseXML{
private Document document;
// private static final Text text = new DOMText("");
private Element root;
public static XMLUtil getInstance(String filepath){
return new XMLUtil(filepath) ;
}
private XMLUtil(String path) {
this.document = this.getDocument(path);
this.root = document.getRootElement();
}
/**
* 得到XML文档
* @param xmlFile 文件名(路径)
*/
private Document getDocument(String xmlFile) {
SAXReader reader = new SAXReader();
reader.setEncoding("UTF-8");
File file = new File(xmlFile);
try {
if (!file.exists()) {
return null;
} else {
return reader.read(file);
}
} catch (DocumentException e) {
e.printStackTrace();
return null;
}
}
/**
* root下增加一个节点
* @param elementName
*
* @param attributeNames 要增加的元素名称
*
* @param attributeValues 要增加的元素属性
*
* @param context 文本内容
*/
@Override
public Element addElementByName(String elementName,Map<String, String> attrs, String context) {
Element root,subElement;
try {
root = document.getRootElement();
subElement = root.addElement(elementName);
for (Map.Entry<String, String> attr : attrs.entrySet()) {
subElement.addAttribute(attr.getKey(), attr.getValue());
}
subElement.setText(context==null ? "" : context);
} catch (Exception e) {
e.printStackTrace();
return null;
}
return subElement;
}
public Element addElementByName(String elementName,
Map<String, String> attrs) {
// TODO Auto-generated method stub
return this.addElementByName(elementName, attrs, null);
}
private Element loadElementByArrributes(Element element,Map<String,String> attributes) {
List<Attribute> list = element.attributes();
String key,val,tarVal;
int count = 0;
for(Attribute a : list){
key = a.getName();
val = a.getValue();
tarVal = attributes.get(key);
if(tarVal!=null &&tarVal.equals(val))
count ++;
}
if(count == attributes.size()){
return element;
}
Element tar = null;
List<Element> childs = element.elements();
for(Element e : childs){
tar = this.loadElementByArrributes(e, attributes);
if(tar!=null)
return tar;
}
return null;
}
/**
* 输出xml文件
*
* @param document
* @param filePath
* @throws IOException
*/
public void writeXml(String filePath) {
File xmlFile = new File(filePath);
XMLWriter writer = null;
try {
if (xmlFile.exists())
xmlFile.delete();
writer = new XMLWriter(new FileOutputStream(xmlFile),OutputFormat.createPrettyPrint());
writer.write(document);
writer.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (writer != null)
try {
writer.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
@Override
public Element createElement(String elementName, String label, String value) {
// TODO Auto-generated method stub
return this.createElement(elementName, label, value, null);
}
@Override
public Element createElement(String elementName, String label,
String value, String context) {
// TODO Auto-generated method stub
Element result = DocumentHelper.createElement(elementName);
Attribute attribute = DocumentHelper.createAttribute(result, label, value);
result.add(attribute);
result.setText(context==null ? "" : context);
return result;
}
@Override
public Element createElement(String elementName, Map<String, String> attrs) {
// TODO Auto-generated method stub
return this.createElement(elementName, attrs, null);
}
@Override
public Element createElement(String elementName, Map<String, String> attrs,
String context) {
// TODO Auto-generated method stub
Element result = DocumentHelper.createElement(elementName);
attrs.forEach((K,V)->{
result.add(DocumentHelper.createAttribute(result, K, V));
});
result.setText(context==null ? "" : context);
return result;
}
@Override
public void addElementInTarget(Element target, Element element) {
// TODO Auto-generated method stub
target.add(element);
}
@Override
public Element addElementInTarget(Element target, String elementName,
Map<String, String> attrs, String context) {
// TODO Auto-generated method stub
Element e = this.createElement(elementName, attrs, context);
this.addElementInTarget(target, e);
return e;
}
@Override
public void addElement(Element element) {
// TODO Auto-generated method stub
this.addElementInTarget(root.element("root"), element);
}
@Override
public List<Element> findElementByName(String elementName) {
// TODO Auto-generated method stub
List<Element> records = new ArrayList();
this.loadAllElementByName(document.getRootElement(), elementName, records);
return records;
}
private void loadAllElementByName(Element element,String elementName,List<Element> records) {
String name = element.getName();
if(name.equals(elementName))
records.add(element);
List<Element> childs = element.elements();
for(Element e : childs)
this.loadAllElementByName(e, elementName, records);
}
/**
* 通过指定id查找节点
* @param id
* @return
*/
@Override
public Element findElementById(String id) {
Map<String,String> attributes = new HashMap(4);
attributes.put("id", id);
List<Element> list = this.findAllElementByArrributes(attributes);
return list.size()==0 ? null : list.get(0);
}
/**
* 通过指定属性查找节点
* @param attributes
* @return
*/
@Override
public List<Element> findAllElementByArrributes(Map<String,String> attributes) {
List<Element> records = new ArrayList();
this.loadAllElementByArrributes(document.getRootElement(), attributes,records);
return records;
}
@Override
public Element findElementByArrributes(Map<String, String> attributes) {
// TODO Auto-generated method stub
return this.loadElementByArrributes(document.getRootElement(), attributes);
}
private void loadAllElementByArrributes(Element element,Map<String,String> attributes,List<Element> records) {
List<Attribute> list = element.attributes();
String key,val,tarVal;
int count = 0;
for(Attribute a : list){
key = a.getName();
val = a.getValue();
tarVal = attributes.get(key);
if(tarVal!=null &&tarVal.equals(val))
count ++;
}
if(count == attributes.size()){
records.add(element);
return ;
}
List<Element> childs = element.elements();
for(Element e : childs)
this.loadAllElementByArrributes(e, attributes,records);
}
@Override
public boolean deleteElement(List<Element> tarlist) {
// TODO Auto-generated method stub
Element p;
try {
for(Element e : tarlist){
p = e.getParent();
if(p!=null)
p.remove(e);
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
return false;
}
return true;
}
@Override
public boolean deleteElement(Element tar) {
// TODO Auto-generated method stub
Element p;
try {
p = tar.getParent();
if(p!=null)
p.remove(tar);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
return false;
}
return false;
}
@Override
public boolean deleteElement(String elementName) {
// TODO Auto-generated method stub
List<Element> es = this.findElementByName(elementName);
return this.deleteElement(es);
}
@Override
public boolean deleteElementByAttributes(Map<String,String> attributes) {
// TODO Auto-generated method stub
List<Element> es = this.findAllElementByArrributes(attributes);
return this.deleteElement(es);
}
@Override
public void modifyElement(Element element, Map<String, String> attributes,String context) {
// TODO Auto-generated method stub
List<Attribute> list = element.attributes();
String key,val,tarVal;
for(Attribute a : list){
key = a.getName();
if(attributes.containsKey(key))
element.remove(a);
}
for(Map.Entry<String, String> entry : attributes.entrySet())
element.add(DocumentHelper.createAttribute(element, entry.getKey(), entry.getValue()));
element.setText(context==null ? "" : context);
}
@Override
public List<Element> loadSubElement(Element element) {
// TODO Auto-generated method stub
List<Element> list = new ArrayList();
this.loadSubElementHelper(element, list);
return list;
}
private void loadSubElementHelper(Element element,List<Element> list) {
// TODO Auto-generated method stub
List<Element> all = element.elements();
for(Element e : all){
list.add(e);
loadSubElementHelper(e, list);
}
}
@Override
public Element loadRoot() {
// TODO Auto-generated method stub
return this.root;
}
}