栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

42-XML介绍

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

42-XML介绍

XML介绍
XML即可扩展标记语言(Extensible Markup Language) W3C在1998年2月发布1.0版本,2004年2月又发布1.1版本,但因为1.1版本不能向下兼容1.0版本,所以1.1没有人用 同时,在2004年2月W3C又发布了1.0版本的第三版。我们要学习的还是1.0版本 W3C是万维网联盟,HTML和XML都是来自他手 特点----------------------- 可扩展的,标签都是自定义的,语法十分严格 XML的作用-------------------------



 


     
        张百万
             
             
            
             
         

        15
    

    
        小斌
        18
        
            

            
        
    

    
    








    
        林黛玉
        20
        
        5000
        2010-01-01

    

    
        杜甫
        40
        
        15000
        2010-01-01
    



由于XML的标签是可以随便写的,没有规范 所以在XML技术里,可以编写一个文档来约束一个XML文档的书写规范,这称之为XML约束 基本各种框架,都可以解析XML,且解析不同的XML 且基本每个框架都有一套XML约束,使得你写的XML按照他的规则书写 而我们通常需要看出这个规则,来使得我们写XML时,框架解析XML,可以对该框架起作用 常见的xml约束: DTD Schema DTD(document Type Definition),文档类型定义,用来约束XML文档 规定XML文档中元素的名称,子元素的名称及顺序,元素的属性等 开发中,我们不会自己编写DTD约束文档 通常情况我们都是通过框架提供的DTD约束文档,编写对应的XML文档 常见框架使用DTD约束有:Struts2、hibernate等

        
        
        
        
        
        


引入dtd文档到xml文档中,两种方式 内部dtd:将约束规则定义在xml文档中,写在xml里 外部dtd:将约束的规则定义在外部的dtd文件中 外部:






     
        长海
        20
        
    

    
        大玲子
        18
        
    


当xml的age标签内容为2000时,明显不合理的,于是就有了更加强大的xml约束Schema,他也可以写xml文件 Schema是新的XML文档约束, 比DTD强大很多,是DTD 替代者 Schema本身也是XML文档,但Schema文档的扩展名为xsd,而不是xml Schema 功能更强大,内置多种简单和复杂的数据类型,如限制数字大小,对age(年龄)的限制 Schema 支持命名空间 (一个XML中可以引入多个约束文档) 注意对于特定的标签,xml基本都可以写,如Scheam的格式xml也可以写,但需要指定格式使得xml的标签名可以有":" 但基本上这样的格式我们用Schema即xsd来记录 当然dtd的格式,xml是不可以操作的,因为格式完全不同 即xml不可以写dtd,但可以写xsd(需要指定格式),即可以理解为xsd是xml的一种 而对于这两种约束,都可以写xml的
 
但是必须符合xml的格式或者兼容xml格式的才可以写,如java不可以写,不符合或者兼容 


    
    
    
    
      
    
        
            
            
        
    
    
        
            
            
            
        
        
    
    
        
            
            
        
    
    
        
            
            
        
    
    
        
            
        
    




    
    
        张三
        200
        male
    

    
        张三
        200
        
       
        male
    


当将数据存储在XML后,我们就希望通过程序获得XML的内容 如果我们使用Java基础所学习的IO知识是可以完成的,不过你需要非常繁琐的操作才可以完成 且开发中会遇到不同问题(只读、读写) 人们为不同问题提供不同的解析方式,并提交对应的解析器,方便开发人员操作XML

解析器:就是根据不同的解析方式提供的具体实现 有的解析器操作过于繁琐,为了方便开发人员,有提供易于操作的解析开发包 JAXP:sun公司提供的解析器,支持DOM和SAX两种思想 DOM4J:一款非常优秀的解析器 , Dom4j是一个易用的、开源的库,用于XML,XPath和XSLT 它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP,第三方开发出来的解析方式,需要相应jar包 Jsoup:jsoup 是一款Java 的HTML解析器 ,也可以解析XML PULL:Android内置的XML解析方式,类似SAX dom4j 的使用-------------

上面是需要的包 使用核心类SaxReader加载xml文档获得document,通过document 对象获得文档的根元素,然后就可以操作了 常用API如下: SaxReader对象----------------------------- read(…) 加载执行xml文档 document对象----------------------------- getRootElement() 获得根元素 Element对象----------------------------- elements(…) 获得指定名称的所有子元素,可以不指定名称 element(…) 获得指定名称的第一个子元素,可以不指定名称 getName() 获得当前元素的元素名 attributevalue(…) 获得指定属性名的属性值 elementText(…) 获得指定名称子元素的文本值 getText() 获得当前元素的文本内容 若标签下只有标签,其实是有文本的,只不过为空而已



    
    
        
            
        
    

    
        
            
            
            
        
        
    

    
        
            
            
        
    

    
        
            
            
            
        
    

    
        
            
        
    




    
        张百万
        25
        抽烟
    

    
        于谦
        55
        烫头
    

    
        小斌
        25
        喝酒
    



package com.lagou.xml03;

import org.dom4j.document;
import org.dom4j.documentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;

import java.util.List;

public class TestDOM4j {

    //获取XML文件中的 所有的元素名称(标签)
    @Test
    public void test1() throws documentException {

        //1.获取XML解析对象
        //核心类SaxReader加载xml文档获得document
        SAXReader reader = new SAXReader();

        //2.解析XML 获取 文档对象 document
        //read(…) 加载执行xml文档
        document document = 
            reader.read("H:\jdbc_work\xml_task03\src\com\lagou\xml03\user.xml");
        //不可以有中文,不识别
        //从这里看出,中文做路径是不好的,有些虽然可以使用中文,但大多数的不可以使用

        //3.获取根元素
        //getRootElement() 获得根元素
        Element rootElement = document.getRootElement();

        //获取根元素名称
        //getName() 获得当前元素的元素名
        System.out.println(rootElement.getName());

        //获取 根元素下的标签
        //elements(…) 获得指定名称的所有子元素,可以不指定名称
        List elements = rootElement.elements();
        for (Element element : elements) {
            System.out.println("根标签下的子节点: " + element.getName());

            List eList = element.elements();
            for (Element e : eList) {
                System.out.println("user标签下的子节点" + e.getName());
                //有顺序的
            }

            break;
        }

    }

    //获取XML中标签的文本信息 和 属性信息
    @Test
    public void test2() throws documentException {

        //1.获取解析XML的 SAXReader
        SAXReader reader = new SAXReader();

        //2.获取文档对象
        document document = 
            reader.read("H:\jdbc_work\xml_task03\src\com\lagou\xml03\user.xml");

        //3.获取根节点
        Element rootElement = document.getRootElement();

        //4.获取子节点 user
        List elements = rootElement.elements();

        //5.获取集合中的第一个 子节点
        //element(…) 获得指定名称的第一个子元素,这个现在必须指定名称了
        Element user = elements.get(0);
        //用get更方便,0下标从0开始,即集合中的第一个,List的方法,大多数语言或者程序,下标都是从0开始的

        //6.获取节点中的文本信息
        //attributevalue(…) 获得指定属性名的属性值
        String id = user.attributevalue("id");//获取属性 id的值
        //elementText(…) 获得指定名称子元素的文本值
        String name = user.elementText("name");
        String age = user.elementText("age");
        //element(…) 获得指定名称的第一个子元素,这个现在必须指定名称了
        String hobby = user.element("hobby").getText();

        //打印
        System.out.println(id + " " + name +" " + age + " " + hobby);
    }
}

XPath 是一门在 XML 文档中查找信息的语言 可以使用xpath查找xml中的内容 由于DOM4J在解析XML时只能一层一层解析,所以当XML文件层数过多时使用会很不方便,结合XPATH就可以直接获取到某个元素

上面是需要的包

上述的"//"是无视语法中的路径的 不再是Element对象了,而是节点对象 常用方法: selectSingleNode(query): 查找和 XPath 查询匹配的一个节点,参数是Xpath 查询串 selectNodes(query):得到的是xml根节点下的所有满足 xpath 的节点,参数是Xpath 查询串 Node:节点对象


    
        金瓶梅
        金圣叹
        99
    
    
        红楼梦
        曹雪芹
        69
    
    
        Java编程思想
        埃克尔
        59
    

package com.lagou.xml04;

import org.dom4j.document;
import org.dom4j.documentException;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
import org.junit.Test;

import java.util.List;

public class TestXPath {

    
    @Test
    public void test1() throws documentException {

        //1.创建XML解析对象
        SAXReader reader = new SAXReader();

        //2.解析XML 获取 文档对象
        document document = 
            reader.read("H:\jdbc_work\xml_task03\src\com\lagou\xml04\book.xml");

        //3.通过selectSingleNode() 方法获取 name节点
        //selectSingleNode(query): 查找和 XPath 查询匹配的一个节点,参数是Xpath 查询串
        //查到是第一个,即按顺序来,无论你的语法如何,都只获得一个,如//name也是获得第一个
        Node node1 = document.selectSingleNode("/bookstore/book/name");
        //该路径是Xpath查询串,简称语法路径
        //该节点可以理解为得到的name标签
        //注意:这里用反斜杠会报错,转义的也不可以,必须正斜杠/,而文件可以使用转义的反斜杠(\)
        //但没转义的不可
        //获得元素名
        System.out.println("节点的名称: " + node1.getName());
        //获得元素文本内容
        System.out.println("书名: " + node1.getText());

        //4.获取第二本书的书名
        Node node2 = document.selectSingleNode("/bookstore/book[3]/name"); //下标从一开始,不是0
        System.out.println("书名: " + node2.getText());
    }


    
    @Test
    public void test2() throws documentException {

        SAXReader reader = new SAXReader();

        document document = 
            reader.read("H:\jdbc_work\xml_task03\src\com\lagou\xml04\book.xml");

        //1.获取第一个booke节点中的  id属性的值
        Node node1 = document.selectSingleNode("/bookstore/book/attribute::id");
        //attribute::id表示book的id属性,且是第一个
        System.out.println("第一个book的id属性值: " + node1.getText() );

        //2.获取最后一个book节点的 id属性值
        Node node2 = document.selectSingleNode("/bookstore/book[last()]/attribute::id");
        //最后一个book的id属性
        System.out.println("最后一个book节点中的属性值: " + node2.getText());
        //在XPath里getTest()不只是可以用来获取标签内容,也可以获取属性内容

        //3.通过id的值 获取book2节点 中的书名
        Node node3 = document.selectSingleNode("/bookstore/book[@id='book2']");

        String name = node3.selectSingleNode("name").getText();
        //节点可以继续使用语法来操作,即可以不用指定路径,而是指定自己所拥有的标签名
        //当然你也可以重新指定路径,来改变指向,即改变节点
        //即当你遇到多个相同id时,可以先用list获得他们(使用selectNodes()方法)
        //然后一个一个的继续使用节点操作
        //这样的方法,可以使得,你一次性获得所有信息,而不用修改语法了
        //语法:双引号里面的格式(操作)
        System.out.println("id为book2的 节点的书名是: " + name);

    }

    
    @Test
    public void test3() throws documentException {

        SAXReader reader = new SAXReader();

        document document = 
            reader.read("H:\jdbc_work\xml_task03\src\com\lagou\xml04\book.xml");

        //1.查询所有的节点
        //selectNodes(query):得到的是xml根节点下的所有满足 xpath 的节点,参数是Xpath 查询串
        //只要满足,都要获得,如/bookstore/book,获得所有的book,即长度为3,因为有三个满足条件
        //或者//book,无视语法路径,也有三个满足的book
        List list = document.selectNodes("//*");
        //记住:包括根节点
        //即代表所有

        for (Node node : list) {
            System.out.println("节点名: " + node.getName());
        }
        //获取时,从第一个开始,以此类推

        //2.获取所有的书名
        List list1 = document.selectNodes("//name");
        //当
        //a//b时是先从第一个a开始,然后取多个b,这样就符合所有
        for (Node node : list1) {
            System.out.println("书名: " + node.getText());
        }

        //3.获取 id值为 book1 的节点中的所有内容
        List list2 = document.selectNodes("/bookstore/book[@id='book1']//*");
        //只能用单引号了,双引号会连接
        for (Node node : list2) {
            System.out.println(node.getName() + " = " + node.getText());
        }
    }
}

 list = document.selectNodes("//*");
        //记住:包括根节点
        //即代表所有

        for (Node node : list) {
            System.out.println("节点名: " + node.getName());
        }
        //获取时,从第一个开始,以此类推

        //2.获取所有的书名
        List list1 = document.selectNodes("//name");
        //当
        //a//b时是先从第一个a开始,然后取多个b,这样就符合所有
        for (Node node : list1) {
            System.out.println("书名: " + node.getText());
        }

        //3.获取 id值为 book1 的节点中的所有内容
        List list2 = document.selectNodes("/bookstore/book[@id='book1']//*");
        //只能用单引号了,双引号会连接
        for (Node node : list2) {
            System.out.println(node.getName() + " = " + node.getText());
        }
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/755964.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号