工具类:
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
* xml解析工具类
* @author zql
* @createTime 2020-11-01 12:44:59
* @version 1.1
* @modifyLog 1.1 优化代码
*
*/
public class XmlUtil {
/**
*
* @param xmlString xml字符串
* @return
* @throws DocumentException
*/
public static XmlData readXml(String xmlString) throws DocumentException {
Document doc = DocumentHelper.parseText(xmlString);
XmlData xmlData = new XmlData();
Element root = doc.getRootElement();
XmlUtil.parse(root, xmlData);
return xmlData;
}
/**
*
* @param doc document对象
* @return
*/
public static XmlData readXml(Document doc) {
XmlData xmlData = new XmlData();
Element root = doc.getRootElement();
XmlUtil.parse(root, xmlData);
return xmlData;
}
private static XmlElement parse(XmlElement parent, Element domElement, XmlData xmlData) {
XmlElement element = new XmlElement(domElement);
if (Objects.nonNull(parent)) {
parent.addChild(element);
element.setParent(parent);
}
List<?> childrens = domElement.elements();
for (Object obj : childrens) {
XmlUtil.parse(element, (Element) obj, xmlData);
}
xmlData.addElement(element);
return element;
}
private static void parse(Element domElement, XmlData xmlData) {
XmlUtil.parse(null, domElement, xmlData);
}
/**
* xml元素处理类
* @author zql
* @createTime 2020-11-01 20:53:00
* @version 1.1
* @modifyLog 1.1 优化代码
*/
public static class XmlData {
private Map<String, List<XmlElement>> elements = new HashMap<String, List<XmlElement>>();
/**
*
* @param name xml元素名
* @param index 索引,从0开始
* @return 传入的元素名(name参数)对应的第(index + 1) 个元素
*/
public XmlElement getElement(String name, int index) {
return this.elements.get(name).get(index);
}
/**
*
* @param name xml元素名
* @return 传入的元素名(name参数)对应的所有元素
*/
public List<XmlElement> getElements(String name) {
return this.elements.get(name);
}
public void addElement(XmlElement xmlElement) {
List<XmlElement> els = this.elements.get(xmlElement.getName());
if (Objects.isNull(els)) {
els = new ArrayList<XmlElement>();
this.elements.put(xmlElement.getName(), els);
}
els.add(xmlElement);
}
/**
*
* @param name xml元素名
* @return 传入的元素名(name参数) 对应的第1个元素的文本内容
*/
public String getElementText(String name) {
XmlElement element = this.getElement(name, 0);
return Objects.isNull(element) ? "" : element.getText();
}
/**
*
* @param name xml元素名
* @param attr 传入的元素名(name参数)中指定的属性名
* @return 传入的元素名(name参数)对应的第1个元素中指定的属性名(attr参数)对应的属性值
*/
public String getElementAttr(String name, String attr) {
XmlElement element = this.getElement(name, 0);
return Objects.isNull(element) ? "" : element.getAttr(attr);
}
/**
*
* @param name xml元素名
* @return 传入的元素名(name参数)对应的第1个元素的所有属性键值对,key为属性名,value为属性值
*/
public Map<String, String> getElementAttrs(String name) {
XmlElement element = this.getElement(name, 0);
return Objects.isNull(element) ? null : element.getAttrs();
}
/**
*
* @param name xml元素名
* @return 传入的元素名(name参数)对应的第1个元素的子元素列表
*/
public List<XmlElement> getElementChildren(String name) {
XmlElement element = this.getElement(name, 0);
return Objects.isNull(element) ? null : element.getChildren();
}
}
/**
* xml元素封装类
* @author zql
* @createTime 2020-11-01 20:50:53
* @version 1.1
* @modifyLog 1.1 优化代码
*
*/
public static class XmlElement {
private XmlElement parent;
private List<XmlElement> children = new ArrayList<XmlElement>();
private Map<String, String> attrs = new HashMap<String, String>();
private String text = "";
private String name = "";
public XmlElement(Element e) {
this.name = e.getName();
this.text = e.getText();
for (int i = 0; i < e.attributes().size(); i++) {
Attribute a = (Attribute) e.attributes().get(i);
this.addAttr(a.getName(), a.getValue());
}
}
/**
*
* @return 当前元素的父元素
*/
public XmlElement getParent() {
return this.parent;
}
/**
*
* @param parent 当前元素的父元素
*/
public void setParent(XmlElement parent) {
this.parent = parent;
}
/**
*
* @return 当前元素的子元素列表
*/
public List<XmlElement> getChildren() {
return this.children;
}
/**
*
* @param children 当前元素的子元素列表
*/
public void setChildren(List<XmlElement> children) {
this.children = children;
}
/**
*
* @return 当前元素的所有属性键值对,key为属性名,value为属性值
*/
public Map<String, String> getAttrs() {
return this.attrs;
}
/**
*
* @param attrs 当前元素的所有属性键值对,key为属性名,value为属性值
*/
public void setAttrs(Map<String, String> attrs) {
this.attrs = attrs;
}
/**
*
* @return 当前元素的文本内容
*/
public String getText() {
return this.text;
}
/**
*
* @param text 当前元素的文本内容
*/
public void setText(String text) {
this.text = text;
}
/**
*
* @param attr 指定的属性名
* @return 当前元素指定的属性名(attr参数) 对应的属性值
*/
public String getAttr(String attr) {
return this.attrs.get(attr);
}
/**
*
* @return 当前元素的标签名
*/
public String getName() {
return this.name;
}
/**
*
* @param name 当前元素的标签名
*/
public void setName(String name) {
this.name = name;
}
public void addAttr(String key, String value) {
this.attrs.put(key, value);
}
public void addChild(XmlElement child) {
this.children.add(child);
}
@Override
public String toString() {
return "XmlElement [parent=" + (Objects.isNull(this.parent) ? null : this.parent.name)
+ ", children=" + this.children + ", attrs=" + this.attrs
+ ", text=" + this.text + ", name=" + this.name + "]";
}
}
}
测试类:
import org.dom4j.DocumentException;
import org.junit.Test;
import java.util.List;
import java.util.Map;
/**
* xml解析工具测试类
*
* @author zql
* @version 1.0
* @createTime 2021-01-03 0:26:00
* @modifyLog
*/
public class XmlUtilTest {
@Test
public void readXml() throws DocumentException {
String xmlStr = getXmlInfo();
XmlUtil.XmlData data = XmlUtil.readXml(xmlStr);
List<XmlUtil.XmlElement> elements = data.getElements("Name");
for (XmlUtil.XmlElement xe : elements) {
System.out.println(xe);
}
Map<String, String> maps = data.getElementAttrs("Student");
for (Map.Entry<String, String> m : maps.entrySet()) {
System.out.println(m.getKey() + " = " + m.getValue());
}
}
public String getXmlInfo () {
StringBuilder sb = new StringBuilder("<?xml version = \"1.0\" encoding = \"utf-8\"?>");
sb.append("<School type = \"1\">");
sb.append("<Client>C01</Client>");
sb.append("<Student type = \"2\">");
sb.append("<Name>张三</Name>");
sb.append("<Num>1006010022</Num>");
sb.append("<Classes>信管141</Classes>");
sb.append("<Address>浙江杭州</Address>");
sb.append("<Tel>123456</Tel>");
sb.append("</Student>");
sb.append("<Student type = \"2\">");
sb.append("<Name>王五</Name>");
sb.append("<Num>1006010055</Num>");
sb.append("<Classes>电子141</Classes>");
sb.append("<Address>浙江杭州</Address>");
sb.append("<Tel>456789</Tel>");
sb.append("</Student>");
sb.append("</School>");
return sb.toString();
}
}
maven项目依赖
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>