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解析。

你可能感兴趣的:(XML解析之DOM解析)