DOM解析

DOM ——Document Object Model(文档对象模型)

​ ——提供一套用于解析XML文档的API

​ ——按照XML定义的标记块来创建对象实例并设置相应的属性

​ ——可以按照标记块的层次结构来创建对象的层次结构

DOM解析相关类/接口

​ 解析XML——包:javax.xml.parsers / org.w3c.dom

  1. DocumentBuilderFactory类DOM文档解析器的工厂类,用于创建解析器对象
  2. DocumentBuilder类DOM文档解析类,用于解析XML文档
  3. Document:文档实体接口
  4. Element类:代表文档的一个元素
  5. Node类:代表DOM模型中的实体的主要数据模型,既可是元素也可以是属性项
  6. NodeList类:节点列表
  7. DocumentBuilderFactory.newInstance();

DOM解析常用方法

  • DocumentBuilderFactory.newInstance();

    作用:创建文档模型工厂对象

  • DocumentBuilderFactory. newDocumentBuilder();

​ 作用: 创建解析器对象

  • DocumentBuilder.parse(InputStream is);

​ 作用: 将输入流代表的XML文档加载到内存中

  • DocumentBuilder.getDocumentElement();

​ 作用: 获得根元素

  • ElementgetChildNodes();

​ 作用: 获得当前元素的所有子节点元素。返回一个NodeList类型的对象

  • NodeList.item(i);

​ 作用: 返回节点列表中索引值为i的列表项

  • Node.getNodeType();

​ 作用: 获得节点类型

  • ElementgetAttribute(String s);

​ 作用: 获得指定属性的属性名称

  • ElementgetFristChild().getNodeValue();

​ 作用: 获得当前属性的数据

遍历xml数据

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class DomParser {

    class People {
        String name;
        String age;
    }

    String text = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" + "<android.support.design.widget.CoordinatorLayout\n"
            + "\txmlns:android=\"http://schemas.android.com/apk/res/android\"\n"
            + "\txmlns:app=\"http://schemas.android.com/apk/res-auto\"\n"
            + "\txmlns:tools=\"http://schemas.android.com/tools\"\n" + "\tandroid:layout_width=\"match_parent\"\n"
            + "\tandroid:layout_height=\"match_parent\"\n" + "\t>\n" + "\n" + "\t<LinearLayout\n"
            + "\t\tandroid:layout_height=\"match_parent\"\n" + "\t\tandroid:layout_width=\"match_parent\"\n"
            + "\t\tandroid:orientation=\"vertical\">\n" + "\n" + "\t\t<android.support.design.widget.AppBarLayout\n"
            + "\t\t\tandroid:layout_width=\"match_parent\"\n" + "\t\t\tandroid:layout_height=\"wrap_content\"\n"
            + "\t\t\tandroid:theme=\"@style/ThemeOverlay.AppCompat.Dark.ActionBar\"\n"
            + "\t\tandroid:text=\"测试\"\n"
            + "\t\t\tapp:layout_scrollFlags=\"scroll|enterAlways\">\n" + "\n"
            + "\t\t\t<android.support.v7.widget.Toolbar\n" + "\t\t\t\tandroid:id=\"@+id/toolbar\"\n"
            + "\t\t\t\tandroid:layout_width=\"match_parent\"\n" + "\t\t\t\tandroid:layout_height=\"wrap_content\"\n"
            + "\t\t\t\tandroid:background=\"@color/colorPrimary\"\n"
            + "\t\t\t\tapp:popupTheme=\"@style/ThemeOverlay.AppCompat.Light\"/>\n" + "\n"
            + "\t\t</android.support.design.widget.AppBarLayout>\n" + "\n" + "\t\t<ImageButton\n"
            + "\t\t\tandroid:layout_width=\"wrap_content\"\n" + "\t\t\tstyle=\"?android:attr/buttonBarButtonStyle\"\n"
            + "\t\t\tandroid:layout_height=\"wrap_content\"\n"
            + "\t\t\tandroid:src=\"@android:drawable/ic_menu_close_clear_cancel\"/>\n" + "\n"
            + "\t\t<android.support.design.widget.CoordinatorLayout\n" + "\t\t\tandroid:id=\"@+id/coordinatorlayout\"\n"
            + "\t\t\tandroid:layout_width=\"match_parent\"\n" + "\t\t\tandroid:layout_height=\"wrap_content\"\n"
            + "\t\t\tandroid:layout_alignParentBottom=\"true\"/>\n" + "\n" + "\t\t<include\n"
            + "\t\t\tlayout=\"@layout/app_error\"/>\n" + "\n" + "\t</LinearLayout>\n" + "\n"
            + "</android.support.design.widget.CoordinatorLayout>\n" + "\n";

    public void parse() {
        DocumentBuilderFactory factory = null;
        DocumentBuilder builder = null;
        Document document = null;
        InputStream inputStream = null;
        // (2)实现DOM解析
        ArrayList list = new ArrayList<People>();
        factory = DocumentBuilderFactory.newInstance();
        try {
            // 惯例 取得document文件实例的过程
            builder = factory.newDocumentBuilder();
            inputStream = new ByteArrayInputStream(text.getBytes());
            ;// 以工程文件下assets文件夹为根目录
            document = builder.parse(inputStream);

            // 取得根Element 以此列出所有节点NodeList
            Element root = document.getDocumentElement();
            if (root instanceof Node) {
                System.out.println("========");
                printfNodes(root);
                return;
            }
            System.out.println("root xml = " + root.getNodeName() + " " + root.getNodeValue() + " type="
                    + root.getNodeType() + " tag=" + root.getTagName());
            // getElementsByTagName是在当前的Element 下查找"people"标志并生成NodeList
            NodeList nodes = root.getChildNodes(); // root.getElementsByTagName("LinearLayout");
            NamedNodeMap nodemap = root.getAttributes();
            for (int i = 0; i < nodemap.getLength(); i++) {
                System.out.println(
                        "name = " + nodemap.item(i).getNodeName() + " value=" + nodemap.item(i).getNodeValue());
            }

            // 取出每个节点中的数据,这里应该分成3种数据,
            // ①是name、age那样的Attribute数据;
            // ②是在<people>括号外的NodeValue数据;
            // ③最后是在其地下的另一个node数据节点。
            for (int i = 0; i < nodes.getLength(); i++) {

                Node peopleitem = nodes.item(i);
                System.out.println(".............");
                printfNodes(peopleitem);
            }

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    // 递归输出nodes
    void printfNodes(Node node) {
        NodeList nodelist = node.getChildNodes();
        System.out.println(
                "node name=" + node.getNodeName() + " value=" + node.getNodeValue() + " type=" + node.getNodeType());
        if (node.getNodeType() == 1) {
            printfAttributes(node);
        }
        for (int n = 0; n < nodelist.getLength(); n++) {
            Node nodeitem = nodelist.item(n);
            System.out.println("node item = " + nodeitem.getNodeName() + " value=" + nodeitem.getNodeValue() + " type="
                    + nodeitem.getNodeType() + " ");
            printfNodes(nodeitem);
        }
    }

    // 输出一个node的所有标签 android:layout_width android:layout_height等
    void printfAttributes(Node node) {
        NamedNodeMap map = node.getAttributes();
        for (int ii = 0; ii < map.getLength(); ii++) {
            System.out.println("name = " + map.item(ii).getNodeName() + " value=" + map.item(ii).getNodeValue());
        }
    }

}

发表评论

邮箱地址不会被公开。 必填项已用*标注