• 在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;

    }

  • 相关阅读:
    exchange 2010 数据库管理
    windows Sql server performance monitor
    windows powershell
    开始Dev之路
    配置adb环境
    android当中安装androidstudio时问题
    进阶之旅(一)
    ubuntu 下配置Android环境
    Android开发中的设计模式
    android anr之后如何导出traces.txt
  • 原文地址:https://www.cnblogs.com/cnsec/p/13407174.html
Copyright © 2020-2023  润新知