XML解析之DOM解析

BB两句

一开始我也不会,就找资料,这种资料多的要命,一搜一大堆,眼花缭乱的,没看到满意的。。。
反正要掌握的,何不多写写,别人写的大多数是针对某个xml进行解析的,我不喜欢这样,太麻烦。。。

以下代码基本上可以解析平常xml格式的内容了,代码不需要怎么改动

走起

首先获取DOM解析最重要的工厂类,通过工厂类获取解析xml用到的对象,就是下面这俩。。

    DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();

对象获取到了,就要解析xml了吧,解析xml当然要知道解析哪个xml啊,所以接下来就是设置要解析的XML。
这里说一下,DOM解析方式是先把整个XML都读取到内存中,然后进行解析,比较适合较小的XML文件

    // 读取xml文件到内存中
    Document document = documentBuilder.parse(new FileInputStream("src/msg.xml"));

上面这个是直接读取文件的,做android的大多数都是服务器返回的数据,不可能再写到文件中在读取,下面是直接读取String解析的放方法

    String xml = "这里是你的xml字符串";
    Document document = documentBuilder.parse(new InputSource(new StringReader(xml)));

看代码

    public static void DomParser() throws ParserConfigurationException, IOException, SAXException {
        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
        // 读取xml文件到内存中
        Document document = documentBuilder.parse(new FileInputStream("src/AndroidManifest.xml"));
        // 获取根节点
        Element documentElement = document.getDocumentElement();
        // 获取根节点名称
        System.out.print(documentElement.getTagName());
        // 获取节点中的属性
        NamedNodeMap attributes = documentElement.getAttributes();
        // 遍历节点
        for (int i = 0; i < attributes.getLength(); i++) {
            System.out.print(" " + attributes.item(i).getNodeName() + "=" + attributes.item(i).getNodeValue());
        }
        // 无用,格式化打印出的信息用
        System.out.println();
        // 获取当前节点下的子节点
        NodeList childNodes = documentElement.getChildNodes();
        parserNode(childNodes);
    }

    /**
     * 递归遍历xml节点和属性信息
     *
     * @param childNodes 节点NodeList对象
     */
    public static void parserNode(NodeList childNodes) {

        // 遍历节点
        for (int i = 0; i < childNodes.getLength(); i++) {
            // 去除无用节点字符,就是xml中节点之间的空格。
            if (childNodes.item(i).getNodeType() != Node.TEXT_NODE) {
                // 获取节点名称
                String nodeName = childNodes.item(i).getNodeName();
                // 获取当前节点下的子节点,如果没有childNodes1.getLength()会=1
                NodeList childNodes1 = childNodes.item(i).getChildNodes();
                // childNodes1.getLength()=1的时候表示当前节点下没有节点,只有值,直接打印出节点值
                if (childNodes1.getLength() == 1) {
                    System.out.print("\t" + nodeName + "=" + childNodes.item(i).getTextContent());
                } else {
                    System.out.print(nodeName);
                }
                // 获取当前节点下的属性并遍历属性
                NamedNodeMap attributes = childNodes.item(i).getAttributes();
                if (attributes != null) {
                    for (int j = 0; j < attributes.getLength(); j++) {
                        String attributesName = attributes.item(j).getNodeName();
                        String attributesValue = attributes.item(j).getNodeValue();
                        System.out.print(" " + attributesName + "=" + attributesValue);
                    }
                }
                System.out.println();
                parserNode(childNodes1);
            }
        }
    }

个人觉得比那些直接getElementsByTagName(String name)方法获取方便自由一点,再往上可以改改封装一下,使用反射应该就能应付大多数XML解析。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,957评论 19 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,393评论 25 708
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,766评论 18 399
  • 假期比上班还累,是因为期待着放松,却没有真正轻松。比如昨天。登高踏青祭祖,聊天聚会吃饭,练车远行发飙,没管孩子,没...
    安曼阅读 398评论 0 0
  • 明天是周一了,新的开始。年就过去了,孩子们要上学了,又年长一算了,开始新的学习,新的一段。 或许对于一...
    小鹿panda阅读 550评论 1 3