在Java中使用XPath快速优雅的读取XML, JAXB真的是太繁重

这是一个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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值