XML——DOM解析

DOM解析概述

原理:xml解析器一次性把整个xml文档加载进内存,然后在内存中构建一颗Document的对象,通过Document对象,得到树上的节点对象,通过节点对象访问(操作)到xml文档的内容。

解析工具:
JAXP(sun公司官方)
JDOM
DOM4J

利用DOM4J解析

import java.io.File;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;
/**
 * 第一个Dom4j读取xml文档的例子
 * @author Colin
 */
public class Demo1 {

    public static void main(String[] args) {
        try {
            //1.创建一个xml解析器对象
            SAXReader reader = new SAXReader();
            //2.读取xml文档,返回Document对象
            Document doc = reader.read(new File("./src/contact.xml"));
            
            System.out.println(doc);
        } catch (DocumentException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
}


节点的关系

节点关系图.png

得到节点信息

private  static void test1() throws DocumentException{
        SAXReader reader = new SAXReader();
        Document document  = reader.read(new File("./src/contact.xml"));
        //2.nodeIterator: 得到当前节点下的所有子节点对象(不包含孙以下的节点)
        Iterator iterator = document.nodeIterator();
        while(iterator.hasNext()){
            Node node = iterator.next();
            String name = node.getName();
            System.out.println(name);        
        }
    }

遍历xml文档的所有节点

public void test2() throws Exception{
        //1.读取xml文档,返回Document对象
        SAXReader reader = new SAXReader();
        Document doc = reader.read(new File("./src/contact.xml"));
        //得到根标签
        Element rooElem = doc.getRootElement();
        getChildNodes(rooElem);
    }
    
    /**
     * 获取传入标签下的所有子节点
     * @param elem
     */
    private void getChildNodes(Element elem){
        System.out.println(elem.getName());
        //得到子节点
        Iterator it = elem.nodeIterator();
        while(it.hasNext()){
            Node node = it.next();
            //1.判断是否是标签节点
            if(node instanceof Element){
                Element el = (Element)node;
                //递归
                getChildNodes(el);
            }
        }
    }

注意:
这里使用Element的getName方法获取了标签名称,下面这个例子对获取Element的方法做一总结

public void test3() throws Exception{
        //1.读取xml文档,返回Document对象
        SAXReader reader = new SAXReader();
        Document doc = reader.read(new File("./src/contacts.xml"));
        
        //2.得到根标签
        Element  rootElem = doc.getRootElement();
        //得到标签名称
        String name = rootElem.getName();
        System.out.println(name);
        
        //3.得到当前标签下指定名称的第一个子标签
        /*
        Element contactElem = rootElem.element("contact");
        System.out.println(contactElem.getName());
        */
        
        //4.得到当前标签下指定名称的所有子标签
        /*
        Iterator it = rootElem.elementIterator("contact");
        while(it.hasNext()){
            Element elem = it.next();
            System.out.println(elem.getName());
        }
        */
        
        //5.得到当前标签下的的所有子标签
               /*
       List list = rootElem.elements();
       for(Element e:list){
            System.out.println(e.getName());
        }
              */
        
        
        //获取更深层次的标签(方法只能一层层地获取)
        Element nameElem = doc.getRootElement().
                    element("contact").element("name");
        System.out.println(nameElem.getName());
        
    }

获取属性

public void test4() throws Exception{
        //1.读取xml文档,返回Document对象
        SAXReader reader = new SAXReader();
        Document doc = reader.read(new File("./src/contact.xml"));
        
        //获取属性:(先获的属性所在的标签对象,然后才能获取属性)
        //1.得到标签对象
        Element contactElem = doc.getRootElement().element("contact");
        //2.得到属性
        //2.1  得到指定名称的属性值
        /*
        String idValue = contactElem.attributeValue("id");
        System.out.println(idValue);
        */
        
        //2.2 得到指定属性名称的属性对象
        /*Attribute idAttr = contactElem.attribute("id");
        //getName: 属性名称    getValue:属性值
        System.out.println(idAttr.getName() +"=" + idAttr.getValue());*/
        
        //2.3 得到所有属性对象,返回LIst集合
        /*List list = contactElem.attributes();
        //遍历属性
        for (Attribute attr : list) {
            System.out.println(attr.getName()+"="+attr.getValue());
        }*/
        
        //2.4 得到所有属性对象,返回迭代器
        Iterator it = contactElem.attributeIterator();
        while(it.hasNext()){
            Attribute attr = it.next();
            System.out.println(attr.getName()+"="+attr.getValue());
        }
        
    }

获取文本

public void test5() throws Exception{
        //1.读取xml文档,返回Document对象
        SAXReader reader = new SAXReader();     
        Document doc = reader.read(new File("./src/contact.xml"));
        
        /**
         * 注意: 空格和换行也是xml的内容
         */
        String content = doc.getRootElement().getText();
        System.out.println(content);
        
        //获取文本(先获取标签,再获取标签上的文本)
        Element nameELem = 
            doc.getRootElement().element("contact").element("name");
        //1. 得到文本
        String text = nameELem.getText();
        System.out.println(text);
        
        //2. 得到指定子标签名的文本内容
        String text2 = 
            doc.getRootElement().element("contact").elementText("phone");
        System.out.println(text2);
        
    }

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