package utils;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class XmlUtil {
static SAXReader saxReader = new SAXReader();
/**
* 获得Xml文档对象
*/
public static Document read(File xmlFile) {
Document document = null;
try {
document = saxReader.read(xmlFile);
} catch (DocumentException e) {
e.printStackTrace();
}
return document;
}
/**
* 获得Xml文档对象
*
* @param xmlFileName xml文件的绝对路径
*/
public static Document read(String xmlFileName) {
return read(new File(xmlFileName));
}
/**
* 通过指向xml 文件的URL获得Document对象
*
* @param url
* @return Document
*/
public static Document read(URL url) {
Document document = null;
try {
document = saxReader.read(url);
} catch (DocumentException e) {
e.printStackTrace();
}
return document;
}
/**
* 递归获取到的element集合
*/
static List<Element> elements = new ArrayList<Element>();
/**
* 递归获取全部element
*
* @param parentElement 发起递归的根element
*/
public static void getElements(Element parentElement) {
@SuppressWarnings("unchecked")
List<Element> elementList = parentElement.elements();
for(Element element : elementList) {
elements.add(element);
if(element.elements().size() > 0) {
getElements(element);
}
}
}
/**
* 获取document下全部element
* @param Document
* @return
*/
public static List<Element> getAllElements(Document doc) {
Element rootElement = doc.getRootElement();
elements = new ArrayList<Element>();
elements.add(rootElement);
getElements(rootElement);
return elements;
}
/**
* 是否包含某属性值
* @param element 需要查询的节点
* @param attrName 参数名(注android:这样的命名空间不用加)
* @return
*/
public static boolean hasAttribute(Element element, String attrName) {
@SuppressWarnings("unchecked")
List<Attribute> attributes = element.attributes();
for(Attribute attr : attributes) {
if(attrName.equals(attr.getName())) {
return true;
}
}
return false;
}
/**
* 将Document写回至xml文件
* @param file
* @param doc
*/
public static void write2xml(File file, Document doc) {
XMLWriter writer;
try {
writer = new XMLWriter(new FileOutputStream(file));
writer.write(doc);
writer.close();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 替换XML文件中attribute的value值
* @param tarDoc 目标document
* @param targetString 目标替换文字
* @param replacement 替换成的内容
* @param matchAttr 匹配参数名,即只会替换该参数名对应的值
* @return 是否有替换操作
*/
public static boolean replaceAttrValue(Document tarDoc, String targetString, String replacement, String matchAttr) {
List<String> targetList = new ArrayList<String>();
targetList.add(targetString);
return replaceAttrValue(tarDoc, targetList, replacement, matchAttr);
}
/**
* 替换XML文件中attribute的value值
* @param tarDoc 目标document
* @param tarStrList 目标替换文字,模糊替换,即只要匹配list集合里中其中一个就会被抽取替换
* @param replacement 替换成的内容
* @param matchAttr 匹配参数名,即只会替换该参数名对应的值,null时不做筛选
* @return 是否有替换操作
*/
@SuppressWarnings("unchecked")
public static boolean replaceAttrValue(Document tarDoc, List<String> tarStrList, String replacement, String matchAttr) {
boolean hasReplace = false;
List<Element> tarElements = XmlUtil.getAllElements(tarDoc);
for(Element element : tarElements) {
List<Attribute> attrs = element.attributes();
for(Attribute attr : attrs) {
if(matchAttr == null || !attr.getName().equals(matchAttr+"")) {
continue;
}
String attrValue = attr.getValue();
int index = tarStrList.indexOf(attrValue);
if(index != -1) {
attr.setValue(attrValue.replace(tarStrList.get(index), replacement));
hasReplace = true;
}
}
}
return hasReplace;
}
/**
* 替换指定目录下全部xml文件内符合自定义条件的Element名称
*
* @param tarDoc 目标document
* @param targetList 目标替换文字,模糊替换,即只要匹配list集合里中其中一个就会被抽取替换
* @param replacement 替换成的内容
* @return 是否有替换操作
*/
public static boolean replaceElementName(Document tarDoc, List<String> targetList, String replacement) {
boolean hasReplace = false;
List<Element> tarElements = XmlUtil.getAllElements(tarDoc);
for(Element element : tarElements) {
int index = targetList.indexOf(element.getName());
if(index != -1) {
element.setName(replacement);
hasReplace = true;
}
}
return hasReplace;
}
}