这是一个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;

}

 

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐