由于项目需要对xml文件做解析,选定了xpath来做xml文件的处理(mybatis源码中的xml文件解析也是用的xpath)。对xpath操作xml文件的常用功能做了简单的封装,写成了一个xpath的工具类,源码如下:
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.*;
import java.io.ByteArrayInputStream;
import java.util.ArrayList;
import java.util.List;
/**
* Copyright: Copyright (c) 2019 xxx有限公司
*
* @ClassName: XPathUtil
* @Description: xml文件解析
* @version: v1.0.0
* @author: tblong
* @date: 2020/4/8 17:44
* <p>
* Modification History:
* Date Author Version Description
* -------------------------------------------------------------*
* 2020/4/8 tblong v1.0.0 新建
*/
public class XPathUtil {
private Document document;
/**
* @Description: xpath构造方法
*
* @param: [xml]
* @return:
* @throws:
* @version: v1.0.0
* @author: tblong
* @date: 2020/4/9 9:32
*
* Modification History:
* Date Author Version Description
*---------------------------------------------------------*
* 2020/4/9 tblong v1.0.0 新建
*/
public XPathUtil(String xml) throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
document = builder.parse(new ByteArrayInputStream(xml.getBytes("UTF-8")));
}
/**
* @Description: 获取指定path节点的全部文本信息集合
*
* @param: [xPathStr]
* @return: java.util.List<java.lang.String>
* @throws:
* @version: v1.0.0
* @author: tblong
* @date: 2020/4/9 9:35
*
* Modification History:
* Date Author Version Description
*---------------------------------------------------------*
* 2020/4/9 tblong v1.0.0 新建
*/
public List<String> searchNodeTextByXPath(String xPathStr) {
List<String> nodeTextList = new ArrayList<String>();
if (document != null) {
XPath xPath = XPathFactory.newInstance().newXPath();
try {
XPathExpression expression = xPath.compile(xPathStr);
NodeList nodeList = (NodeList) expression.evaluate(document, XPathConstants.NODESET);
if (nodeList != null) {
for (int i = 0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);
if (node != null) {
nodeTextList.add(node.getTextContent());
}
}
return nodeTextList;
}
} catch (XPathExpressionException e) {
e.printStackTrace();
}
}
return nodeTextList;
}
/**
* @Description: 根据指定path,查找node集合
*
* @param: [xPathStr]
* @return: java.util.List<org.w3c.dom.Node>
* @throws:
* @version: v1.0.0
* @author: tblong
* @date: 2020/4/9 9:29
*
* Modification History:
* Date Author Version Description
*---------------------------------------------------------*
* 2020/4/9 tblong v1.0.0 新建
*/
public List<Node> searchNodeByXPath(String xPathStr) {
List<Node> nodeList = new ArrayList<Node>();
if (document != null) {
XPath xPath = XPathFactory.newInstance().newXPath();
try {
XPathExpression expression = xPath.compile(xPathStr);
NodeList nodes = (NodeList) expression.evaluate(document, XPathConstants.NODESET);
if (nodes != null) {
for (int i = 0; i < nodes.getLength(); i++) {
nodeList.add(nodes.item(i));
}
return nodeList;
}
} catch (XPathExpressionException e) {
e.printStackTrace();
}
}
return nodeList;
}
/**
* @Description: 查找指定path的首个node节点
*
* @param: [xPathStr]
* @return: org.w3c.dom.Node
* @throws:
* @version: v1.0.0
* @author: tblong
* @date: 2020/4/9 9:30
*
* Modification History:
* Date Author Version Description
*---------------------------------------------------------*
* 2020/4/9 tblong v1.0.0 新建
*/
public Node searchFirstNodeByXPath(String xPathStr) {
List<Node> nodeList = searchNodeByXPath(xPathStr);
return nodeList.isEmpty() ? null : nodeList.get(0);
}
}