文档声明必须出现在xml文件...">
美文网首页我爱编程
三、XML约束(dtd、schema)与解析

三、XML约束(dtd、schema)与解析

作者: 来个芒果 | 来源:发表于2016-12-07 21:46 被阅读0次

    1、XML的语法

    • 文档声明
      写法: <?xml version="1.0" ?>
      • 文档声明必须出现在xml文件的第一行和第一列的位置。

      • 属性:

        • version="1.0" XML的版本 (必须写)
        • encoding="UTF-8" 编码集 (可选的)
        • standalone="yes或者no" 代表xml的文件是否是独立的。(如果是no,不独立,可以引入外部的文件)(可选的)
        • 因为不写该属性,可以引入外部的文件。
      • 乱码会伴随你们一生?

        • 产生的原因:保存文件时和打开文件时采用的编码不一致。
        • 解决办法:保存文件可打开文件采用的编码一致就ok。(MyEclipse不会产生乱码问题)
    • 元素(***)

      • 要有开始有结束。
      • 不能交叉嵌套
      • 只能有一个根元素(必须有,并且只能有一个)
      • 命名规范:
        • 区分大小写 错误的:<a></A> 代表两个标签
        • 不能以数字和-中划线开头 错误的:<1a> <-a>
        • 不能以XML(Xml XML xml)开头 错误的:<xmlaa>
        • 不能包含空格和冒号。
    • 属性(***)

      • 自定义:命名规范同上。
      • 在同一个元素上,不能有相同的属性。(*****)
      • 可以使用双引号或者单引号。
    • 注释(*)

      • 和HTML的注释相同
      • 注释不能嵌套。
      • 特殊字符
        * < <
        * > >
        * & &
        * " "
        * ' '
        • CDATA区
          • 把标签中的内容作为字符串。
          • 语法:<![CDATA[
            内容:当成字符串
            ]]>
    • PI(处理指令)--如文档声明等等
      *可结合css对显示的内容进行控制。


    2、DTD约束

    约束出现的目的是为了xml的可读与规范,如规定可以拥有哪些属性、元素等。

    • DTD的约束
      * 快速入门
      * 快速入门的步骤:
      * 需要出现哪些标签?
      * 在DTD的文件中编写元素
      <!ELEMENT 元素名称 元素类型>
      * 判断元素是否是复杂还是简单元素?
      * 如果是简单元素:(#PCDATA) 代表是字符串
      * 如果是复杂元素:(子节点)

                * 需要在book.xml引入DTD的文件
                    * <!DOCTYPE 根节点 SYSTEM "DTD文件的地址">
            
            * DTD与XML文档的关联方式
                * 可以在XML的文件中直接书写DTD的代码。(经常使用)
                    <!DOCTYPE 根节点 [
                        DTD的代码
                    ]>
                
                * 引入本地的DTD文件(经常使用)
                    <!DOCTYPE 根节点 SYSTEM "DTD文件的地址">
                
                * 引入网络上的DTD文件
                    <!DOCTYPE 根节点 PUBLIC "DTD文件名称" "DTD文件的地址">
      
    • 元素定义
      * 语法:<!ELEMENT 元素名称 元素类型>
      元素类型:
      * (#PCDATA) 字符串
      * EMPTY 空
      * ANY 任意的
      * (子元素)

                    * 子元素:
                        * 子元素之间的关系
                            * ,     子元素出现是有顺序的
                            * |     子元素只能出现一个
                            
                        * 子元素出现的次数
                            *   +       子元素出现1次或多次
                            *   *       子元素出现0次或多次
                            *   ?       子元素出现0次或1次
                    
                <!ELEMENT MYFILE ((TITLE*, AUTHOR?, EMAIL)* | COMMENT)>     
                    
                    <MYFILE>
                        <TITLE></TITLE>
                        <AUTHOR></AUTHOR>
                        <EMAIL></EMAIL>
                        <TITLE></TITLE>
                        <AUTHOR></AUTHOR>
                        <EMAIL></EMAIL>
                        <TITLE></TITLE>
                        <AUTHOR></AUTHOR>
                        <EMAIL></EMAIL>
                    </MYFILE>
      
    • 属性定义(AttributeList)
      * 写法: <!ATTLIST 元素名称
      属性名称 属性类型 属性约束
      属性名称 属性类型 属性约束
      >
      * 属性类型
      * CDATA 字符串
      * 枚举(没有提供关键字) (男人|女人)
      * ID 代表唯一的值,不能只写数字

                * 属性的约束
                    * #REQUIRED     必须出现的。必选属性的值可以等于空,只要出现在元素中就可以,如:name属性必选,则name=“”也是可以的,可以不写值。
                    * #IMPLIED      可选的
                    * #FIXED        固定值 #FIXED "值"
                    * 默认值(不用)
      
    • 实体定义(用的不多)
      * <!ENTITY 别名 "值" >
      * 需要在xml中引入别名--&别名;,浏览器打开文件后,在引入的位置上显示值的。

    3、schema约束

    • schema约束:
      * schema和DTD的对比(面试题):
      * schema符合XML的语法结构。
      * 可以解析schema文档。
      * schema对名称空间支持的好。
      * schem支持更多的数据类型,自定义的数据类型。

            * 在schema中预先给xml定义元素和属性
            * schema的后缀名是.xsd
            * 只能有一个根节点,名称是schema。
      
    • schema命名空间详解:

      xml文件:
      <?xml version="1.0" encoding="UTF-8"?>
      <书架 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      // 引入W3C名称空间,我是实例文档。
      xmlns="http://www.itcast.cn/book.xsd"
      //引入自己编写的schema的文档
      xsi:schemaLocation="http://www.itcast.cn/book.xsd book.xsd">
      //引入自己写的schema文档地址--“命名空间,位置”
      //问题:元素上不能有相同的属性名称,不可有两个xmlns属性
      * 解决:起别名
      * 技巧:在下面出现标签的概率小起别名
      <书>
      <书名>三国演义</书名>
      <出版社>中信出版社</出版社>
      <售价>89.7</售价>
      <作者>罗贯中</作者>
      </书>
      </书架>
      xsd文件:
      <?xml version="1.0" encoding="UTF-8"?>

      <schema xmlns="http://www.w3.org/2001/XMLSchema"
      // xsd文档属于xml,element等元素都是w3c提供的基本元素,我们需要引用,所以它的命名空间一定要写。
      targetNamespace="http://www.itcast.cn/book.xsd"
      //【自己写的xsd】要起一个名字,可以任意起,为防止重名推荐在前面加上公司域名。
      elementFormDefault="qualified">
      //qualified-质量好的,unqualified-非质量好的。(比如,若为unqualified,则别名仅可写在最外层,内层有用到别名的元素可不写,
      但容易出现问题,本例中若自己写的xsd的命名空间起别名aa,有多个
      书元素,且各个书元素用到的命名空间不一样,就容易造成混乱,搞不清哪个书用的是哪个命名空间的。)

      <element name="书架">
      <complexType>
      <sequence>
      <element name="书">
      <complexType>
      <sequence>

      <element name="书名" type="string"></element>
      <element name="出版社" type="string"></element>
      <element name="售价" type="double"></element>
      <element name="作者" type="string"></element>
      </sequence>
      </complexType>
      </element>
      </sequence>
      </complexType>
      </element>
      </schema>
    • 定义属性:置于sequence和complexType之间。
      </sequence>
      <attribute name="出版社" type="string" use="required"></attribute>
      </complexType>
    • simpleContent:仅含文本的。


    • xsd中any:引入任何标签。

    4、XML解析

    • 常用的有两种?DOM和SAX
      * 区别:
      DOM解析XML
      * 在内存中形成树状结构
      * 缺点:如果文档过大,容易产生内存溢出的问题。
      * 优点:方便做增删改的操作

                    SAX解析
                      * 基于事件驱动,边读边解析
                      * 优点:不会产生内存溢出问题。
                      * 缺点:不能做增删改操作。(DOM4J在内存生成树状结构)
        
            *,只能使用DOM方式,如果SAX,只能做查询。
            * DOM4J(*****) JAXP             SUN提供的
                * 想做增删改 企业都在用。DOM4J提供的
                * 全部都可以做。
            * JDOM(不讲了)
      

    4.1、JAXP解析HTML---jaxp开发包是Javase的比部分。具体方法、获取节点等去看jdk开发文档。

            * DOM
                * DocumentBuilderFactory    :解析器工厂类
                * DocumentBuilder   获取解析器对象
                * 解析XML(Document parse(String uri) )
                    // 获取解析器工厂类
                    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
                    // 获取解析器对象
                    DocumentBuilder builder = factory.newDocumentBuilder();
                    // 解析XML的文档,返回document对象
                    Document document = builder.parse("src/book2.xml");
                
                
            * 回写
                * 获取回写的工厂类
                * 获取回写对象
                * 调用回写的方法进行回写。
                    // 创建回写类的工厂
                    TransformerFactory transformerFactory =  TransformerFactory.newInstance();
                    // 获取回写类
                    Transformer transformer = transformerFactory.newTransformer();
                    // 调用回写的方法
                    transformer.transform(new DOMSource(document), new StreamResult("src/book2.xml"));
    

    //Source(document)为输入源。

    注意,在DOM中:父接口Node的子接口有Document、Element等,故Node有的方法,Document和Element等子接口都有,而子接口有的方法Node不一定有。


    注意:- <a price="9">haha</a>Element节点中最多只可能有Attr节点,文本节点与Element节点是相互独立的。

    • 注意划红线部分,hasAttribute方法仅Element可成功调用。

    4.2、 JAXP的SAX解析

    • 只能做查询,不能做增删改。
      * SAX解析
      * 解析器
      * 获取解析器的工厂
      * 获取解析器对象
      * 解析XML(XML的文件的地址,事件处理器)
                * 事件处理器
                    * 自己编写的类,需要继承DefalutHandler类,重写三个方法。(自己决定是打印还是保存)
                    * startElement()
                    * characters()
                    * endElement()      
                    
            * SAX的解析原理:     
                解析器采用SAX方式在解析某个XML文档时,它只要解析到XML文档的一个组成部分,       (边读边解析)
                都会去调用事件处理器的一个方法,解析器在调用事件处理器的方法时,
                会把当前解析到的xml文件内容作为方法的参数传递给事件处理器。
                
                事件处理器由程序员编写,程序员通过事件处理器中方法的参数,
                就可以很轻松地得到sax解析器解析到的数据,从而可以决定如何对数据进行处理。
    

    4.2、 DOM4J的解析(必须会,企业中用的多)

            * 先下载DOM4J相应的jar包。导入工程中,才能使用。
            * 把dom4j-1.6.1.jar导入到工程中。
            * WEB项目:复制dom4j-1.6.1.jar到  WebRoot -- WEB-INF -- lib里面。就ok。
            
            
            
        * DOM4J对XPATH的支持
            * 导入包。jaxen-1.1-beta-6.jar。
            * 怎么使用?
                selectNodes("/AAA")         返回集合
                selectSingleNode()      一个Node对象
                
            * 参数就是xpath的语法
                * /AAA/BBB          获取BBB的节点
                * //BBB             无论层级关系,找到BBB的节点
                * *                 代表是所有
                * /AAA/BBB[1]       找到BBB的第一个       /AAA/BBB[last()]    最后一个
                * @                 属性
    
    • DOM4J扩展:
      通过XML管理学生的信息。
      可以在项目下建立一个xml用于存放学生信息,建一个学生类,操作类(用于对xml操作增删改查),测试类。

    相关文章

      网友评论

        本文标题:三、XML约束(dtd、schema)与解析

        本文链接:https://www.haomeiwen.com/subject/wyjjmttx.html