05_XML的解析_01_dom4j 解析

【简述】

Xml文件出了给开发者看,更多情况使用程序读取xml文件里的内容,这叫做xml解析。

根据解析方式分为:DOM解析 和 SAX解析

 

【解析工具】

(一). 使用DOM解析原理的工具:

  1.JAXP(Oracle-Sun公司官方)

  2.JDOM工具(非官方)

  3.Dom4J工具(非官方,使用者最多,也是SSH三大框架默认读取xml的工具)

(二). 使用SAX解析原理的工具:

   1.SAX官方解析工具(Oracle-Sun官方)

  ....

 

【什么是DOM解析】

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

 

【使用dom4j读取xml文件】

【工程截图】

【提示】

 

 

【person.xml】

<?xml version="1.0" encoding="UTF-8"?>
<students>
    <student id="88888" phone="15888888888" sex="男">
        <name>张三</name>
        <age>18</age>
        <school>HDU</school>
    </student>
    <student>
        <name>李四</name>
        <age>28</age>
        <school>ZKU</school>
    </student>
    <AAAA>
        <aa1>aa111</aa1>
        <aa2>aa222</aa2>
    </AAAA>
    <BBBB></BBBB>
</students>

【1.读取节点信息】

@Test
    public void testNode() throws DocumentException{
        //1.读取XMl文件,返回一个Document对象
        SAXReader saxReader=new SAXReader();
        Document doc=saxReader.read(new File("./src/person.xml"));
        
        //nodeIterator:得到当前节点的下的所有子节点对象(不会遍历孙节点及以下节点)
        Iterator<Node> it=doc.nodeIterator();
        while(it.hasNext()){  //判断是否还有下一个元素
            Node node=it.next();  //取出元素
            System.out.println(node.getName()); //得到节点的名称 
            //System.out.println("-------");
            
            /*
             *  继续取出当前节点的子节点
             *  只有标签节点Element才有子节点
             *  判断当前节点是否是标签节点
             */
            if(node instanceof Element){
                Element elem=(Element) node;
                Iterator<Node> it2=elem.nodeIterator();
                while(it2.hasNext()){
                    Node node2=it2.next();
                    System.out.println(node2.getName());
                    System.out.println("--------");
                }
            }
            
        }
    }

【1.运行结果】

 

【2.遍历获取Xml文档的所有标签】

【2.1公用方法: 递归获取传入标签下的所有子节点】

    /**
     * 【公用方法】获取传入标签下的所有子节点
     */
    private void getChildNodes(Element elem){
        System.out.println(elem.getName());
        //得到子节点
        Iterator<Node> it=elem.nodeIterator();
        while(it.hasNext()){
            Node node=it.next();
            //判断是否是标签节点
            if(node instanceof Element){
                Element el=(Element) node;
                //递归
                getChildNodes(el);
            }
        }
    }

【2.2 testAllNode:遍历获取Xml文档的所有标签】

    /**
     * 遍历获取Xml文档的所有标签
     */
    @Test
    public void testAllNode() throws DocumentException{
        //读取Xml文件,返回Document对象
        SAXReader saxReader =new SAXReader();
        Document doc=saxReader.read(new File("./src/person.xml"));
        
        //得到根标签节点   在一个xml文档中,有且仅有一个根标签
        Element roorElem=doc.getRootElement(); 
        getChildNodes(roorElem);
    }

【2.运行结果】

 

【3.获取标签名】

    /**
     * 获取标签名
     */
    @Test
    public void testElements() throws DocumentException{
        //读取xml文档,返回一个Document对象
        SAXReader saxReader =new SAXReader();
        Document doc=saxReader.read(new File("./src/person.xml"));
        
        //得到根标签
        Element rootElem=doc.getRootElement();
        //得到根标签名称
        String name=rootElem.getName();
        System.out.println("根标签名称:"+name); 
        
        System.out.println("\n=====1.得到当前标签下指定名称的第一个子标签====");
        //得到当前标签下指定名称的第一个子标签
        Element firstElem=rootElem.element("student");
        System.out.println("studnets下的第一个子标签名称:"+firstElem.getName());
        
        System.out.println("\n=====2.得到当前标签下的*指定名称*的所有子标签====");
        //得到当前标签下的指定名称的所有子标签
        Iterator<Element> it=rootElem.elementIterator("student");
        while(it.hasNext()){
            Element elem=it.next();
            System.out.println("while循环下:"+elem.getName());
        }
        
        System.out.println("\n=====3.得到当前标签下的所有子标签====");
        //得到当前标签下的所有子标签
        List<Element> list=rootElem.elements();
        //遍历list
        for(Element e:list){
            System.out.println("遍历的list结果:"+e.getName());
        }
        
        //获取更深层次的标签(方法只能一层层的获取)
        Element nameElem=doc.getRootElement().element("student").element("name");
        System.out.println(nameElem.getName());  //打印的标签名
    }

【3.运行结果】

 

 【4.获取属性值】

 

    /**
     *  获取属性值
     */
    @Test
    public void testGetValue() throws DocumentException{
        //1.读取xml文档,返回Document对象
        SAXReader saxReader=new SAXReader();
        Document doc=saxReader.read(new File("./src/person.xml"));
        
        /**获取属性:(先获得属性所在的标签对象,然后才能获取属性)**/
        //1.得到指定名称的标签对象
        Element contactElem=doc.getRootElement().element("student");

        //2.得到属性
        //2.1得到指定名称的属性值
        String idValue=contactElem.attributeValue("id");
        System.out.println("指定名为'id'的属性值:"+idValue);
        
        //2.2得到指定属性名称的属性对象
        Attribute idAttr=contactElem.attribute("id");
        //getName:属性名称                getValue:属性值
        System.out.println("属性名称:"+idAttr.getName()+" === 属性值:"+idAttr.getValue());
        
        //2.3 得到所有属性对象,返回List集合
        List<Attribute> list=contactElem.attributes();
        //遍历属性
        for(Attribute attr:list){
            System.out.println("【遍历List】属性名称:"+attr.getName()+" === 属性值:"+attr.getValue());
        }
        //2.3得到所有属性对象,返回迭代器Iterator
        Iterator<Attribute> it=contactElem.attributeIterator();
        while(it.hasNext()){
            Attribute attr=it.next();
            System.out.println("【遍历迭代器】属性名称:"+attr.getName()+" === 属性值:"+attr.getValue());
        }
    }

【4.运行结果】

 

【5.获取标签体内容(文本)】

    /**
     * 获取文本
     */
    @Test
    public void testGetText() throws DocumentException{
        //读取Xml文档,返回Document对象
        SAXReader saxReader=new SAXReader();
        Document doc=saxReader.read(new File("./src/person.xml"));
        
        /**
         * 注意:空格和换行也是xml的文本内容
         */
        String contact=doc.getRootElement().getText();  //获取根节点的文本内容
        System.out.println("=======根节点文本内容======");
        System.out.println(contact);
        System.out.println("========================\n");
        
        //获取文本值方式一(先获取标签,再获取标签上的文本)
        Element nameElem =doc.getRootElement().element("student").element("name"); //获取学生姓名
        System.out.println("获取的<name>内的文本:"+nameElem.getText());
        
        //方式二
        String ageText=doc.getRootElement().element("student").elementText("age");
        System.out.println("获取的<age>内的文本:"+ageText);
        
    }

【5.运行结果】

 

【小结】

1.获取节点对象 Node

2.获取标签 Element

3.获取属性

4.获取文本

 

posted @ 2016-09-21 16:42  HigginCui  阅读(566)  评论(0编辑  收藏  举报