当前位置: 首页 > 工具软件 > JAXP > 使用案例 >

J2EE进阶之XML DTD约束和JAXP的DOM解析 六

叶浩荡
2023-12-01

XML DTD约束和JAXP解析

XML的简介

        * 可扩展的标记语言
            * 标签是自定义的   

        * 和HTML类似
        * XML是用来传输数据,不是显示数据

        * XML的版本:
            * XML1.0(使用)    XML1.1(不向下兼容)

        * XML的常见应用
            * 作为框架的配置文件

            * 系统与系统之间进行数据的传输

                * json  
                * webservice    soap    XML

XML的语法

        * 文档声明
            * <?xml version="1.0" ?>
            * 出现在文档的第一行第一列的位置

                * 属性:
                    * version = "1.0"       xml的版本      必须要写的
                    * encoding="UTF-8"      XML的编码集     可选的
                    * standalone="yes/no"   代表xml文件是否是独立的   如果是no,不独立,引入外部的文件。(如果不写,没有问题) 可选的

                * 乱码
                    * 产生的原因:保存文件时和打开文件时采用的编码不一致。
                    * 解决办法:保证保存文件和打开文件编码一致即可。


        * 元素(标签)
            * 分为开始和结合标签
                * 包含标签主体        <abc>文本内容</abc>
                * 不包含标签主体   <abc/>

            * 不能交叉嵌套
            * 只能有一个根节点

            * 命名规范
                * 区分大小写 错误的:<a></A>
                * 不能以数字和中划线开头   错误的:<1a> <-a>
                * 不能以(XML xml Xml)  开头
                * 元素中不能包含空格和冒号


        * 属性
            * XML使用双引号或者单引号
            * 属性不能重复
            * 命名规范和元素相同

        * 注释
            * 和HTML的注释相同的
                * <!-- XML的注释 -->
                * 不能嵌套

        * 特殊字符
            * <     &lt;
            * &     &amp;

            * >     &gt;
            * "     &quot;
            * '     &apos;

        * CDATA区
            * 作用:把中间内容当前普通文本内容
            * 语法:
                <![CDATA[
                    文本内容
                ]]>

        * PI(处理指令)(了解)

XML的约束

        * 为什么是约束:
            <myspring>
                <bean>cn.itcast.login</bean>
            </myspring>

        * 两个概念
            * 格式良好的XML
            * 有效的XML

DTD

            * 快速入门步骤
                * 定义元素
                    * <!ELEMENT 元素名称 元素类型(后指定) >
                * 判断元素是复杂还是简单元素
                    * 如果是简单元素
                        元素类型(#PCDATA)   
                    * 如果是复杂元素
                        元素类型(子元素名称)
                * 引入XML的文件中
                    * <!DOCTYPE 根节点 SYSTEM "DTD的地址" >

demo1

DTD代码:

  1 <?xml version="1.0" encoding="UTF-8"?>
  2 <!ELEMENT 书架 (书)>
  3 <!ELEMENT 书 (书名,作者,售价,简介)>
  4 <!ELEMENT 书名 (#PCDATA)>
  5 <!ELEMENT 作者 (#PCDATA)>
  6 <!ELEMENT 售价 (#PCDATA)>
  7 <!ELEMENT 简介 (#PCDATA)>

xml文件

  1 <?xml version="1.0" encoding="UTF-8"?>
  2 <!DOCTYPE 书架 SYSTEM "book.dtd">
  3 
  4 <书架>
  5     <书>
  6         <书名>javaweb开发大全</书名>
  7         <作者>hah</作者>
  8         <售价>99.8元</售价>
  9         <简介>这书不错啊</简介>
 10     </书>
 11 </书架>

DTD文件与XML文件的关联方式

                * 可以在XML的文件的内部编写DTD的代码
                    * 格式:
                        <!DOCTYPE 根节点 [
                            DTD的代码
                        ]>

                * 引入本地DTD的文件(经常使用)
                    * 格式    <!DOCTYPE 根节点 SYSTEM "DTD文件的地址">

                * 引入网络的DTD的文件(不常使用)
                    * <!DOCTYPE 根节点 PUBLIC "DTD文件的名称" "DTD文件的地址">

demo2 为第二种引入方式

  1 <?xml version="1.0" encoding="UTF-8"?>
  2 <!DOCTYPE 书架 [
  3     <!ELEMENT 书架 (书)>
  4     <!ELEMENT 书 (书名,作者,售价,简介)>
  5     <!ELEMENT 书名 (#PCDATA)>
  6     <!ELEMENT 作者 (#PCDATA)>
  7     <!ELEMENT 售价 (#PCDATA)>
  8     <!ELEMENT 简介 (#PCDATA)>
  9 
 10     
 11 ]>
 12 
 13 <书架>
 14     <书>
 15         <书名>javaweb开发大全</书名>
 16         <作者>hah</作者>
 17         <售价>99.8元</售价>
 18         <简介>这书不错啊</简介>
 19     </书>
 20     
 21 </书架>

DTD的语法

元素定义

    * <!ELEMENT 元素名称 元素类型>

    * 元素类型
        * (#PCDATA)         可解析的字符数据(字符串)
        * EMPTY             空的
        * ANY               任意的
        * (子节点名称)       子节点

    * 子元素
        * 子元素直接的关系
            * ,     子元素是按顺序出现
            * |     是或的关系

        * 子元素出现的次数
            * +     子元素出现1次或多次
            * *     子元素出现0次或多次
            * ?     子元素出现0次或1次


        <!ELEMENT MYFILE ((TITLE*, AUTHOR?, EMAIL)* | COMMENT)> 

属性定义(AttributeList)

        * <!ATTLIST 元素名称 
            属性名称 属性类型 属性约束 
            属性名称 属性类型 属性约束
        >

        * 属性类型
            * CDATA     字符串
            * 枚举        写法:(值1|值2)
            * ID        代表唯一的值,不能重复,不能只写数字

        * 属性约束
            * #REQUIRED     必须出现的
            * #IMPLIED      属性是可选的
            * #FIXED        固定值 (#FIXED "值")
            * 默认值(不常用)

demo

  1 <?xml version="1.0" encoding="UTF-8"?>
  2 <!DOCTYPE 书架 [
  3     <!ELEMENT 书架 (书+)>
  4     <!ELEMENT 书 (书名,作者,售价,简介)>
  5     <!ELEMENT 书名 (#PCDATA)>
  6     <!ELEMENT 作者 (#PCDATA)>
  7     <!ELEMENT 售价 (#PCDATA)>
  8     <!ELEMENT 简介 (#PCDATA)>
  9     
 10     <!ATTLIST 书
 11          出版社 CDATA #FIXED "北大出版社"
 12         出版日期 (2014-11-7|2014-11-5) #REQUIRED
 13         编号 ID #REQUIRED
 14     >
 15     
 16     <!ENTITY username "张三">
 17     
 18 ]>
 19 
 20 <书架>
 21     <书 编号="b"  出版日期="2014-11-5">
 22         <书名>javaweb开发大全</书名>
 23         <作者>&username;</作者>
 24         <售价>99.8元</售价>
 25         <简介>这书不错啊</简介>
 26     </书>
 27     <书 编号="b2" 出版社="北大出版社" 出版日期="2014-11-7">
 28         <书名>葵花宝典</书名>
 29         <作者>越不群</作者>
 30         <售价>99.8两</售价>
 31         <简介>欲练此功...</简介>
 32     </书>
 33 </书架>

实体定义(用的比较少)

                    * <!ENTITY 别名 "值">
                    * 引入该实体 &别名;



        * schema

        * 区别:

XML的解析

* 解析XML的技术有哪些?
    * 解析XML的技术有很多,主要使用DOM和SAX两种技术?
    * DOM和SAX的区别:
        * DOM解析XML会在加载整个文档到内存中,形成树状结构。
            * 缺点:如果文档过大,容易产生内存溢出的问题。
            * 优点:可以做增删改的操作

        * SAX解析是基于事件驱动和事件处理器的,边读边解析。
            * 优点:不会产生内存溢出的问题。
            * 缺点:不能做增删改的操作(但是如果使用DOM4J可以做该操作)

* 几种提供解析XML的jar包
    * JAXP      SUN提供的      (标准)
    * DOM4J DOM4J提供的        (企业应用最多)
    * JDOM  JDOM提供的     (不讲)

JAXP的DOM解析demo

xml 文件:

  1 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
  2 <书架>
  3     <书>
  4         <书名>javaweb开发大全</书名>
  5         <作者>班长</作者>
  6         <售价>99.8元</售价>
  7         <简介>这书不错啊</简介>
  8     </书>
  9     <书>
 10         <书名>葵花宝典</书名>
 11         <作者>越不群</作者>
 12         <售价>99.8两</售价>
 13         <简介>欲练此功...</简介>
 14     </书>
 15 </书架>

解析:

  1 package test;
  2 
  3 import javax.xml.parsers.DocumentBuilder;
  4 import javax.xml.parsers.DocumentBuilderFactory;
  5 import javax.xml.parsers.ParserConfigurationException;
  6 import javax.xml.transform.Transformer;
  7 import javax.xml.transform.TransformerFactory;
  8 import javax.xml.transform.dom.DOMSource;
  9 import javax.xml.transform.stream.StreamResult;
 10 
 11 import org.w3c.dom.Document;
 12 import org.w3c.dom.Element;
 13 import org.w3c.dom.Node;
 14 import org.w3c.dom.NodeList;
 15 
 16 /**
 17  * 
 18  * @author Angus
 19  *  Dom解析
 20  */
 21 public class JaxpDomTest {
 22     public static void main(String[] args) {
 23         try {
 24             run1();
 25         } catch (Exception e) {
 26             // TODO Auto-generated catch block
 27             e.printStackTrace();
 28         }
 29     }
 30     
 31     
 32     /**
 33      * 添加子节点
 34      * 需求:在第二本书下添加子节点
 35      * @throws Exception
 36      */
 37     public static void run2() throws Exception{
 38         // 创建解析器对象的工厂
 39         DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
 40         // 获取解析器对象
 41         DocumentBuilder builder = factory.newDocumentBuilder();
 42         // 解析XML 获取document对象
 43         Document document = builder.parse("src/book2.xml");
 44         // 创建元素
 45         Element cat = document.createElement("猫");
 46         // 设置文本
 47         cat.setTextContent("我是猫");
 48         // 先获取第二本书
 49         Node book2 = document.getElementsByTagName("书").item(1);
 50         // 把元素添加到书的下面
 51         book2.appendChild(cat);
 52         // 回写
 53         // 获取回写类的工厂
 54         TransformerFactory transformerFactory = TransformerFactory.newInstance();
 55         // 获取回写类
 56         Transformer transformer = transformerFactory.newTransformer();
 57         // 进行回写操作
 58         transformer.transform(new DOMSource(document), new StreamResult("src/book2.xml"));
 59     }
 60     /**
 61      * 获取书名的文本内容
 62      * @throws Exception 
 63      */
 64     public static void run1() throws Exception{
 65         //获取解析器对象工厂类
 66         DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
 67         //获取解析器对象
 68         DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
 69         //解析xml文档,返回document对象
 70         Document document = documentBuilder.parse("src/book2.xml");
 71         //获取书名标签
 72         NodeList nodeList = document.getElementsByTagName("书名");
 73         //遍历
 74         for (int i = 0; i<nodeList.getLength(); i++) {
 75             Node node = nodeList.item(i);
 76             System.out.println(node.getTextContent());
 77             //javaweb开发大全   葵花宝典
 78         }
 79     }
 80 }
 类似资料: