java 中xml 基础使用,连载---

xml 简介
    * eXtensible Markup Language : 可扩展标记性语言
        ** 标记型语言 : html 是标记性语言
            - 也是使用标签来操作
        ** 可扩展:
            - html 里面的标签是固定,每个标签都有特定的含义
            - 标签可以自己定义,可以写中文的标点

    * xml 用途
        ** HTML是用于显示数据,xml 也可以显示数据(不是主要功能)
        ** xml 主要功能,为了存储数据

    * xml w3c 组织发布的技术
    * xml有两个版本1.0 1.1
        - 使用都是1.0 版本,(1.1版本不能向下兼容)
xml 的应用
    * 不同的系统之间传输数据

    * 用来表示生活中有关系的数据

    * 经常用在文件配置
        * 比如连接数据库  连接数据库的配置信息

xml 语法
    1. xml的文档声明 ** 
        * 创建一个文件 后缀名 .xml
        * 第一步必须要有一个文档声明(写了文档声明之后,表示xml文件的内容)
        ** <?xml varsion="1.0" encoding="gbk"?>
        *** 文档声明必须写在第一行 
        * 属性
            - version:xml 的版本 1.0 (使用)1.1
            - encoding:xml编码 gbk utf-8 iso8859-1(不包含中文)
            - standalone:是否需要依赖其他文件 yes/no 
        * xml 中文乱码解决
            * 保存修改编码格式
            * 保存和编写的编码格式一致.
        
    2. 定义元素(标签) **
    3. 定义属性 ** 
    4. 注释 ** 
    5. 特殊字符 **
    6. CDATA区(了解)
    7. PI 指令(了解)

5. xml 元素的定义
    ** 标签定义
    ** 标签定义又开始必须要有结束
    ** 标签没有内容,可以在标签内结束
    ** 标签可以嵌套,必须要合理嵌套
    ** 一个xml 中,只能有一个根标签
    ** 在xml 中吧空格和换行都当成内容来解析
    ** xml 标签可以是中文
    ** xml 中标签的命名规则
        1.区分大小写.
        2. 不能以数字和下划线开头(_)
        3. 不能以xml、XML、Xml开头
        4. 不能包含空格和冒号
6.xml 中属性的定义
    * HTML是标记型文档,可以有属性
    * xml也是标记型文档,可以有属性
    ** 属性定义的要求
        1. 一个标签上可以有多个属性
        2. 属性名称不能相同
        3. 属性名称和属性值之间使用 = ,属性值使用引号包起来
        4. 命名规范和标签的命名规范相同
7. xml 中的注释
    * 写法 <!-- 注释 -->
    ** 注意的地方
        *** 注释不能嵌套注释
    ** 注释不能放到第一位
8. xml 特殊字符
    * 如果xml 中显示a<b ,不能正常显示,因为吧<当前标签
        &amp; & 
        < &lt;
        > &gt;
9. CDATA区
        * 可以解决多个字符都需要转移的操作 if(a<b && b<c && d>f)
        * 不需要转移
        ** 写法
            <![CDATA[内容]]> # 普通文本内容
10. PI指令(处理指令)
        * 可以在xml 设置样式
        * 写法: <?xml-stylesheet type="text/css" href="some.css" ?> 引入css样式 
        * 设置样式,只对英文标签起作用,对于中文的标签名不起作用
        ** xml 的语法的总结
            所有的xml 元素都必须有关闭标签
            xml 标签大小写敏感
            xml 必须有正确的嵌套顺序
            xml 文档必须有根元素(只有一个)
            xml 的属性值需要加引号
            特殊字符需要转移 -- CDATA
            xml 中的空格、回车换行会解析时被保留
11. xml的约束
    * 为什么需要约束 ?指定传输的文件格式,和标签定义。
    * xml的约束的技术 : dtd约束和schema约束(看懂)

12. dtd 的快速入门
    * 创建一个文件 后缀名 .dtd
    步骤:
        1.看xml 中有多少个元素 ,有几个元素,在dtd文件中写几个<!ELEMENT>
        2. 判断元素时简单元素还是复杂元素
            - 简单元素:没有子元素
                <!ELEMENT 元素名称 (#PCDATA)>
            - 复杂元素:有子元素的元素
                <!ELEMENT 元素名称(子元素名称)>        
        3. 需要在xml 文件中引入dtd文件
            <!DOCTYPE 根元素名称 SYSTEM "dtd文件路径">
    ** 打开xml 文件使用浏览器打开的,浏览器只负责校验xml的语法,不负责校验约束
    ** 想要xml 约束 ,需要使用工具(myeclipse工具)
13 . dtd的三种引入方式
    1. 引入外部的dtd文件
        <!DOCTYPE 根元素名称 SYSTEM "dtd路径">
    2. 内部的dtd文件
        <!DOCTYPE 根元素 [ 定义 ]>
    3. 使用外部的dtd文件(网络上的dtd文件)
        <!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文档的URL">
        - 后面需要框架 struts2 使用配置文件 使用外部的dtd文件
14. 使用dtd定义元素
    * 语法 : <!ELEMENT 元素名 约束>
    * 简单元素 : 没有子元素的元素
        <!ELEMENT name (#PCDATA) >
        *** (#PCDATA): 字符串
        *** EMPTY: 必须为空(没有内容)    
        *** ANY : 任意内容    
    * 复杂元素:
        <!ELEMENT person (name+|age?,sex*,school)
            - 子元素只能出现一次
         * <!ELEMENT 元素名称(子元素)>
         * 表示子元素出现的次数
             + : 表示一次或者多次
             ?: 0次或者一次
             * : 0 次或者多次
        * 子元素直接使用逗号隔开
            * 表示元素出现的顺序
        * 子元素直接使用|隔开
            ** 表示元素只能出现任意一个
15. 使用dtd定义属性
    * 语法: <!ATTLIST 元素名称
                属性名称 属性类型 属性的约束
            >
            例子:<!
                ATTLIST birthday (aa|bb|cc) #REQUIRED
            >
    * 属性类型 
            - CDATA #REQUIRED 字符串
            - 枚举 :表示只能在一定的范围内出现值,但是只能出现的其中的一个
                ** 红绿灯效果
                **(aa|BB|CC)
            - ID : 值只能是字母或下划线开头
    * 属性的约束
        - #REQUIRED : 属性必须存在
        - #IMPLIED : 属性可有可无
        - #FIXED : 表示一个固定值 #FIXED "abc"
        - 直接值 :默认值
            * 不写属性,使用直接值
            <!ATTLIST school ID5 "WWW" > 
16. 实体的定义
    * 语法 : <!ENTITY 实体名称 “实体的值”>
    *** <!ENTITY TEST "HHAHAH">
    ***使用实体 &实体名称; 比如:&TEST;
    ** 注意 
        * 定义实体需要写在内部dtd里面 ,如果写在外部的dtd里面,有些浏览器下,内容得不到


17. xml的解析的简介 (写到java代码)(****今天最重要的内容****)
    * xml 是标记型文档
    * js使用dom解析标记型文档?    
        - 根据html 的层级结构,在内存中分配一个树形结构,吧html 的标签,属性和文本都封装成对象
        - document对象、element对象、属性对象、文本对象、Node节点对象
    * xml的解析方式(技术):dom和sax
        ** 画图分析
            区别:
            dom : 根据xml的层级机构 ,在内存中分配一个树形结构,把xml中每部分都封装成对象
                * 缺点:
                    使用dom方式解析xml时 ,如果文件过大,会造成内存溢出
                * 优点:
                    很方便的实现增删改操作
            sax : 解析过程:
                采用事件驱动,边读边解析
                从上到下,一行一行的解析,解析到某一个对象,把对象名称返回

                * 优点:
                    使用sax方式不会造成内存溢出,实现查询
                * 缺点:
                    使用sax方式,不能实现增删改操作
        * 想要解析xml ,首先需要解析器
        ** 不同的公司和组织提供了针对dom和sax方式的解析器,通过api方式提供
        *** sun 提供了针对dom和sax解析器 jaxp
        *** dom4j 组织,针对dom和sax 解析器 dom4j (*** 使用最多 **) (包含jdom)
        *** jdom 组织 ,针对 dom和sax解析器 jdom

18. jaxp 的api的查看
    ** jaxp 是javaSE的一部分
    ** jaxp 解析器在jdk的javax.xml.parsers 包里面
        ** 四个类 :分别是针对dom和sax解析使用的类
        *** dom:
            DocumentBuilder :解析器类
                - 这个类是一个抽象类,不能new
                    DocumentBuilderFactory.newDocumentBuilder() 方法获取

                - 一个方法,可以解析xml parse("xml路径") 返回是Document 整个文档
                - 返回的document是一个接口,父接口是Node,如果document没有要操作的方法,可以去Node里寻找需要使用的方法。
                - 在document 里面的方法 org.w3c
                    getElementsByTagName(String tagName); 得到标签 
                    查看jdk帮助文档
            DocumentBuilderFactory:解析器工厂
                - 这个类也是一个抽象类,不能new
                newInstance() 获取DocumentBuilderFactory实例
        *** sax:
            SAXParser:解析器类
            SAXParserFactory:解析器工厂
19. 使用Jaxp 实现简单的查询 
    * 查询xml 中所有的name元素的值
    * 步骤
    // 查询所有name 元素的值
    /*
        1. 创建解析器工厂 
            DocumentBuilderFactory.newInstance();
        2. 根据解析器工厂创建解析器
            builderFactory.newDocumentBuilder;
        3.解析xml 返回document 
            Document document = builder.parse("src/person.xml");
        4. 得到所有的name元素
            docuemnt.getElementsByTagName("name");
        5. 返回集合,遍历集合,得到每一个name元素
            - 遍历 getLength() item()
            - 得到元素里面值 使用 getTextContent();
    *
    */


    * 查询xml中第一个name元素的值
        /*
            1. 创建解析器工厂 
                DocumentBuilderFactory.newInstance();
            2. 根据解析器工厂创建解析器
                builderFactory.newDocumentBuilder;
            3.解析xml 返回document 
                Document document = builder.parse("src/person.xml");
            4. 得到name元素
                NodeList list = document.getElementsByTagName("name")
            5. 使用返回结合,里面的方法item ,下标获取到具体的元素
                Node name1 = list.item(0);
            6. 得到具体的值,使用getTextContent方法
                name1.getTextContent()
        */


20. 使用jaxp添加节点 
    *** 在 第一个p1 下面(末尾) 添加<sex>nv</sex>
    /*
        1. 创建解析器工厂 
            DocumentBuilderFactory.newInstance();
        2. 根据解析器工厂创建解析器
            builderFactory.newDocumentBuilder;
        3.解析xml 返回document 
            Document document = builder.parse("src/person.xml");
        4. 得到第一个p1
            - 得到所有p1,使用item方法下标得到
            Ndoe p1 = document.getElementsByTagName("p1").itme(0);
        5.创建sex标签 createElement
            Element sex1 = document.createElement("sex");
        6. 创建文本createTextNode
            Text text1 = document.createTextNode("nv");
        7. 把文本添加到sex下面的appendChild
            sex1.appendChild(text1);
        8. 把sex 添加到第一个p1 下面
            p1.appendChild(sex1)
        9. 回写xml 
            TransformerFactory transformerFactory = TransformerFactory.newTransformerFactory;
            Transformer transformer = TransformerFactory.newTransformer();
            transformer.transform(new DOMSource(document),new StreamResult("src/person.xml"));
    */


21. 使用jaxp 修改节点 修改第一个p1下面的sex内容是nan
        1. 创建解析器工厂 
            DocumentBuilderFactory.newInstance();
        2. 根据解析器工厂创建解析器
            builderFactory.newDocumentBuilder;
        3.解析xml 返回document 
            Document document = builder.parse("src/person.xml");
        4. 得到sex item 方法
            Ndoe sex1 = document.getElementsByTagName("sex").itme(0);
        5. 修改set里面的值setTextContent 方法
            sex1.setTextContent("nan")
        6.回写xml
            TransformerFactory transformerFactory = TransformerFactory.newTransformerFactory;
            Transformer transformer = TransformerFactory.newTransformer();
            transformer.transform(new DOMSource(document),new StreamResult("src/person.xml"));


22. 使用jaxp 删除节点 删除sex>nan  节点
    1. 创建解析器工厂 
        DocumentBuilderFactory.newInstance();
    2. 根据解析器工厂创建解析器
        builderFactory.newDocumentBuilder;
    3.解析xml 返回document 
        Document document = builder.parse("src/person.xml");
    4. 获取到sex 节点信息
        Node sex1 = document.getElementsByTagName("sex").item(0);
    5. 获取到sex 父节点 
        Node p1 = sex1.getparentNode();
    6. 使用父节点删除 removerChild方法
        p1.removerChild(sex1);
    7. 回写xml
        TransformerFactory transformerFactory = TransformerFactory.newTransformerFactory;
            Transformer transformer = TransformerFactory.newTransformer();
            transformer.transform(new DOMSource(document),new StreamResult("src/person.xml"));

23. 使用jaxp 遍历节点
    ** 把xml 中的所有元素名称打印出来
        1. 创建解析器工厂 
            DocumentBuilderFactory.newInstance();
        2. 根据解析器工厂创建解析器
            builderFactory.newDocumentBuilder;
        3.解析xml 返回document 
            Document document = builder.parse("src/person.xml");
        == 使用递归实现 ====
        4. 得到根节点
        5. 得到根节点的子节点
        6. 打印信息
            list1(document)

    //遍历的方法
    private static void list1(Node node){
        // 判断当前元素的类型 打印操作
        if(node.getNodeType()==Node.ELEMENT_NODE){
            pringln(ndoe.getNodeName());
        }
        // 得到一层子节点
        NodeList list = node.getChildNodes();
        // 遍历list
        for(int i=0;i<list.getLength();i++){
            //得到每一个节点
            Node node1 = list.item(i);
            // 使用递归操作
            list1(node);
            
        }
        
        
        
    }
        
            
            

猜你喜欢

转载自blog.csdn.net/qq_41133533/article/details/86592470
今日推荐