zoukankan      html  css  js  c++  java
  • 在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;

    }

  • 相关阅读:
    20150515
    20150509
    20150507
    好用的log打印类
    20150429
    Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
    word无法切换中文输入法的解决方法
    20140917设置动态壁纸
    WCF入门教程(三)定义服务协定--属性标签
    WCF入门教程(二)从零做起-创建WCF服务
  • 原文地址:https://www.cnblogs.com/cnsec/p/13407174.html
Copyright © 2011-2022 走看看