文档声明必须出现在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)与解析

    1、XML的语法 文档声明写法: 文档声明必须出现在xml文件...

  • XML约束——Schema约束

    Schema与DTD XML Schema符合XML语法结构。 DOM、SAX等XML API很容易解析出XML ...

  • XML类别及解析XML的几种方式

    XML约束文档分为DTD,Schema两种格式 DTD DTD(Document Type Definition)...

  • xml及DTD、schema约束

    layout: posttitle: xml及DTD、schema约束subtitle: 用...

  • XML的Schema约束

    Schema 另一种约束xml文档的语法那就是Schema,用于替代老式的DTD约束。 什么是XML Schema...

  • JavaWeb (day6)

    1.schema 约束 1.dtd 语法: 2.schema符合 xml 的语法,xml 语句3.一个 xml 中...

  • Schema

    Schema约束同DTD一样,XML Schema也是一种用于定义和描述XML文档结构与内容的模式语言。 区别:1...

  • XML2 - 约束

    DTD schema schema 与 DTD 的对比: schema符合XML的语法结构 DOM、SAX等容易解...

  • xml——Schema约束

    dtd 1. schema的介绍 一个xml中可以有schema,多个sche...

  • 三、XML Schema解析验证

    目录 1、XML解析2、XML Schema 或DTD3、复杂的解析和验证4、深度优先搜索 一、XML解析 有一个...

网友评论

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

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