在Java中使用XPath快速优雅的读取XML, JAXB真的是太繁重
这是一个XPath的工具类:不需要任何依赖,都是Java原生APIpublic class XPathReader implements Closeable {private InputStream is = null;private Document document;/**** @param is* @return...
这是一个XPath的工具类:
不需要任何依赖,都是Java原生API
public class XPathReader implements Closeable {
private InputStream is = null;
private Document document;
/**
*
* @param is
* @return
*/
public static XPathReader instance(InputStream is) {
XPathReader pr = new XPathReader();
pr.is = is;
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
pr.document = builder.parse(is);
} catch (Exception e) {
throw new RuntimeException(e);
} finally {
IOCloseUtils.close(is);
}
return pr;
}
public static XPathReader instanceFromResource(String resource) {
return instance(XPathReader.class.getClassLoader().getResourceAsStream(resource));
}
/**
*
* @param content
* @return
*/
public static XPathReader instaceFromString(String content) {
try {
InputStream is = new ByteArrayInputStream(content.getBytes());
return instance(is);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
*
* @param node
* @param attr
* @return
*/
public String attr(Node node, String attr) {
return node.getAttributes().getNamedItem(attr).getNodeValue();
}
/**
*
* @param query
* @param node
* @return
*/
public Node singleNode(String query, Node node) {
try {
XPath xpath = XPathFactory.newInstance().newXPath();
XPathExpression expr = xpath.compile(query);
NodeList nodeList = (NodeList) expr.evaluate(node, XPathConstants.NODESET);
if (null != nodeList && nodeList.getLength() > 0) {
return nodeList.item(0);
} else {
return null;
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
*
* @param query
* @param node
* @return
*/
public List<Node> nodeList(String query, Node node) {
List<Node> nodes = Lists.newArrayList();
try {
XPath xpath = XPathFactory.newInstance().newXPath();
XPathExpression expr = xpath.compile(query);
NodeList nodeList = (NodeList) expr.evaluate(node, XPathConstants.NODESET);
if (null != nodeList && nodeList.getLength() > 0) {
for (int i = 0; i < nodeList.getLength(); i++) {
nodes.add(nodeList.item(i));
}
}
} catch (Exception e) {
throw new RuntimeException(e);
}
return nodes;
}
/**
*
* @param query
* @return
*/
public List<Node> nodeList(String query) {
return nodeList(query, document);
}
/**
*
* @param query
* @return
*/
public Node singleNode(String query) {
return singleNode(query, document);
}
/**
*
* @param query
* @return
*/
public boolean exists(String query) {
return !isEmpty(nodeList(query));
}
/**
*
* @param nl
* @return
*/
private boolean isEmpty(List<Node> nl) {
return CollectionUtils.isEmpty(nl);
}
/**
*
* @param query
* @return
*/
public String value(String query) {
try {
XPath xpath = XPathFactory.newInstance().newXPath();
XPathExpression expr = xpath.compile(query);
return (String) expr.evaluate(document, XPathConstants.STRING);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
public void close() throws IOException {
IOCloseUtils.close(is);
}
}
好了,测试一下:
public String testXPath(String xmlContent) {
XPathReader reader = XPathReader.instaceFromString(xmlContent);
String test = reader.value("/Envelope/Body/XXX/ErrorDetail/ErrorCode");
return test;
}
更多推荐
所有评论(0)