zoukankan      html  css  js  c++  java
  • 六、xml基础

    笔记思维导图

    一、表单提交方式

    • 使用submit提交
    • 使用button提交表单
    • 使用超链接提交

    二、xml的简介(了解)

    • eXtensible Markup Language:可扩展标记型语言
      • 标记型语言:html是标记型语言
        • 也是使用标签来操作
      • 可扩展
        • html里面的标签是固定的,每个标签都有特定的含义 <h1> <br/> <hr/>
        • 标签可以自己定义,可以写中文的标签 <person></person>   <猫></猫>
    • xml用途
      • html是用于显示数据,xml也可以显示数据(不是主要功能)
      • xml主要功能是,为了存储数据
    • xml是w3c组织(万维网联盟)发布的技术
    • xml有两个版本:1.0,1.1   【使用的都是1.0版本,1.1版本不能向下兼容】
    • XML与HTML比较
      • HTML的元素都是固定的,而XML可以自定义元素;
      • HTML用浏览器来解析执行,XML的解析器通常需要自己来写(因为元素是自定义的);
      • HTML只能用阿里表示网页,而XML可以做的事情很多。
    • XML和properties(属性文件)比较
      • 属性文件只能存储平面信息,而XML可以存储结构化信息;
      • 解析属性文件只需要使用Properties类就可以了,而解析XML文档是很复杂的。

    三、xml的应用

    • 不同的系统之间传输数据
      • 比如 qq之间数据的传输
    • 用来表示生活中有关系的数据
      • 比如:
        <中国>
            <山东></山东>
            <安徽></安徽>
            <四川></四川>
        </中国>
    • 经常用在文件配置
      • 比如现在要连接数据库,肯定知道数据库的用户名和密码,数据名称。如果修改数据库的信息,不需要修改源代码,只要修改配置文件就可以了。
      • 比如struts、spring和hibernate都是基于xml作为配置文件的

    四、xml的语法

    • xml的文档声明
      • 创建一个文件 后缀名是 .xml   ,然后使用文档声明来声明XML文件。且文档声明必须写在 第一行第一列
      • 文档声明最简单的语法:<?xml version="1.0"?>     【version属性是必须的】
      • 属性:
        • version: xml的版本 1.0(使用)    1.1
        • encoding:xml编码   如<?xml version="1.0" encoding="gbk"?> 【保存在磁盘上的文件编码要与声明的编码一致】
        • standalone:是否为独立文档,即是否需要依赖其他文件。  该属性值如果为yes 表示独立,如果为no表示不独立,即依赖外部的文件。默认是yes
      • xml的中文乱码问题解决
        • 保存到磁盘时候的编码和设置打开时候的编码一致,不会出现乱码
    • xml的元素(标签)定义
      • 一个标签分为起始标签和结束标签。不含标签体时,可以在标签内结束,如<person/>
      • 一个标签中可以嵌套若干子标签,但所有标签必须合理的嵌套,不允许有交叉嵌套。
      • 一个xml文档必须有且仅有一个根标签,其他标签都是这个根标签的子标签或孙标签。
      • 在xml中把空格和换行都当成内容来解析【xml中,下面这两段代码的含义是不一样的】
        <aa>11111111</aa>
        <aa>
            11111111
        </aa>
      • xml标签可以是中文
      • xml中标签的名称规则
        • xml代码区分大小写 【<p> <P>:这两个标签是不一样的】
        • xml的标签不能以数字和下划线开头 【<2a> <_aa>:错误】
        • xml的标签不能以xml、XML、Xml等开头 【<xmla> <XmlB> <XMLc>:错误】
        • xml的标签不能包含空格和冒号 【<a b> <a:b>:错误】
    • xml中属性的定义
      • html是标记型文档,可以有属性 ;xml也是标记型文档,可以有属性
        <person id1="aaa" id2="bbb"></person>
      • 属性定义的要求
        • 一个标签上可以有多个不同属性
        • 属性名称不能相同
        • 属性名称和属性值之间使用=,属性值使用引号包起来(可以是单引号,也可以是双引号)
        • xml属性的名称规范和元素的名称规范一致
    • xml中的注释
      • 写法<!-- xml的注释 -->
      • 注意的地方:注释不能嵌套
      • 注释也不能放第一行,第一行第一列必须放文档声明
    • xml中的特殊字符
      • <   &lt;     >   &gt;     (转义)
    • CDATA区(了解)
      • 可以解决多个字符都需要转义的操作 if( a<b && b<c && d>f){}  把这些内容放到CDATA区里面,不需要转义了
      • 写法:
        <![CDATA[ 内容  ]]>
        <![CDATA[ <b> if(a<b && b<c && d>f){} </b> ]]>
        <!--把特殊字符,当作文本内容,而不是标签-->
    • PI指令(处理指令)(了解)
      • 作用:用来指挥软件如何解析XML文档。
      • 可以在xml中设置样式。  写法: <?xml-stylesheet type="text/css" href="css的路径"?>
      • 设置样式,只能对英文标签名称起作用,对于中文的标签名称不起作用的。
    • xml的约束
      • 为什么需要约束?
        • 比如现在定义一个person的xml文件,只想要这个文件里面保存人的信息,比如name age等,但是如果在xml文件中写了一个标签<猫>,发现可以正常显示,因为符合语法规范。但是猫肯定不是人的信息,xml的标签是自定义的,需要技术来规定xml中只能出现的元素,这个时候需要约束。
      • xml文档约束是用另一个文件来约束xml文档的结构,例如要求xml文档的根元素必须是<students>,在<students>元素下可以包含0~n个<student>元素,每个<student>元素必须有一个number属性,而且还要有三个子元素,分别为<name>、<age>、<sex>,这三个子元素的内容必须为文本内容,而不能是子元素。
      • xml的约束的技术 : dtd约束 和 schema约束 (会读即可)
        • dtd: dtd是平面式文档,dtd文件不是xml文档,通常扩展名为“.dtd”。它是最早的xml约束;
        • schema:schema本身也是xml文档,它比dtd要更加强大,通常扩展名为“.xsd”。它是新的xml文档约束,用来替代dtd。

    五、xml的约束之dtd

    • dtd的快速入门    【创建一个文件 后缀名为.dtd    步骤如下:】
      • (1)看xml中有多少个元素 ,有几个元素,就在dtd文件中写几个 <!ELEMENT>
      • (2)判断元素是简单元素还是复杂元素
          • 复杂元素(有子元素的元素):<!ELEMENT 元素名称 (子元素)>
          • 简单元素(没有子元素):<!ELEMENT 元素名称 (#PCDATA)>
      • (3)需要在xml文件中引入dtd文件:<!DOCTYPE 根元素名称 SYSTEM "dtd文件的路径">
      • 校验xml的约束,需要使用工具(myeclipse工具) 【若用浏览器打开xml文件,浏览器只负责校验xml的语法,不负责校验约束】
        • 打开myeclipse开发工具
        • 创建一个项目 text
        • 在text的src目录下面创建一个xml文件和一个dtd文件
        • 当xml中引入dtd文件之后,比如只能出现name age,多写了一个a,会提示出错
    • dtd的三种引入方式
      • 引入外部的dtd文件: 
        <!DOCTYPE 根元素名称 SYSTEM "dtd路径">
      • 使用内部的dtd文件: 
        <!DOCTYPE 根元素名称 [
            <!ELEMENT person (name,age)>
            <!ELEMENT name (#PCDATA)>
            <!ELEMENT age (#PCDATA)>
        ]>
      • 使用外部的dtd文件(网络上的dtd文件):
        <!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文档的URL">
        <!-- struts2框架使用配置文件 使用网络上的dtd文件 --> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
    • 使用dtd定义元素
      • 语法: <!ELEMENT 元素名 约束>
      • 简单元素:<!ELEMENT name (#PCDATA)>
        • (#PCDATA): 约束name是字符串类型
        • EMPTY : 元素为空(没有内容) 【比如:<sex></sex>、<br/>】
        • ANY:任意
      • 复杂元素:<!ELEMENT 元素名称 (子元素)>  【例如:<!ELEMENT person (name,age,sex,school)>】
        • 表示子元素出现的次数
          • +:表示一次或者多次
          • ?:表示零次或者一次
          • *:表示零次或者多次
        • 子元素直接使用逗号隔开
          • 表示元素出现的顺序,必须按指定的顺序去编写xml文档
        • 子元素直接使用 | 隔开
          • 表示元素只能出现其中的任意一个
    • 使用dtd定义属性
      • 语法
        <!ATTLIST 元素名称 属性名称 属性类型 属性的约束>
      • 属性类型
        <!-- CDATA:字符串 -->
        <!ATTLIST birthday ID1 CDATA #REQUIRED>
        
        <!-- 枚举:表示只能在一定的范围内出现值,但是只能每次出现其中的一个【红绿灯效果 aa|bb|cc】 -->
        <!ATTLIST age ID2 (AA|BB|CC) #REQUIRED>
        
        <!-- ID:值只能是字母或者下划线开头 不能出现空白字符 -->
        <!ATTLIST name ID3 ID #REQUIRED>
      • 属性的约束
        • #REQUIRED:表示该属性必须存在
        • #IMPLIED:属性可有可无
        • #FIXED: 表示一个固定值。语法:#FIXED "固定值"    【属性的值必须是设置的这个固定值】
          <!ATTLIST sex ID4 CDATA #FIXED "ABC">
        • 直接值:表示属性的取值为该默认值   【不写属性,使用直接值(该默认值);写了属性,使用设置的那个值】
          <!ATTLIST school ID5 CDATA "WWW">
    • DTD定义实体
      • 实体用于为一段内容创建一个别名,以后在XML文档中就可以使用别名引用这段内容了。
      • 语法: <!ENTITY 实体名称 "实体的值">
        <!-- 定义实体 -->
        <!ENTITY TEST "HAHAHEHE">
        <!-- 使用实体:&实体名称; -->
         &TEST;
      • 注意:定义实体需要写在内部dtd里面,如果写在外部的dtd里面,有某些浏览器下,内容得不到

    六、xml约束之Schema

    • schema概述
      • XML Schema也是一种用于定义和描述XML文档结构与内容的模式语言,其出现是为了克服DTD的局限性(schema目前不能替代dtd)
      • Schema VS DTD:
        • Schema符合XML语法结构
        • DOM、SAX等XML API很容易解析出Schema文档中的内容
        • Schema对名称空间支持的非常好
        • XML Schema比XML DTD支持更多的数据类型,并支持用户自定义新的数据类型
        • XML Schema定义约束的能力非常强大,可以对XML实例文档作出细致的语义限制
        • Schema不能像DTD一样定义实体,比DTD更复杂,但Schema现在已是w3c组织的标准,它正逐步取代DTD
      • Schema文件自身就是一个XML文件(但它的扩展名通常为.xsd),而不是像DTD一样使用自成一体的语法
      • 和xml文件一样,一个XML Sshema文档也必须有有一个根节点,但这个根节点的名称为Schema
      • 编写了一个XML Schema约束文档后,通常需要把这个文件中声明的元素绑定到一个URI地址上,这个URI地址叫namespace名称空间,以后XML文件就可以通过这个URI(即名称空间)引用绑定指定名称空间的元素。
    • Schema的快速入门 【创建一个schema文件,后缀名是.xsd 。 步骤如下:】
      • (1)看xml中有多少个元素
      • (2)看简单元素和复杂元素
      • (3)简单元素,写在复杂元素的
      • (4)在被约束的文件里面引入约束文件

    七、xml的解析(重点)

    • xml是标记型文档
    • js使用dom解析标记型文档
      • 根据html的层级结构,在内存中分配一个树形结构,把html的标签,属性和文本都封装成对象
      • document对象、element对象、属性对象、文本对象、Node节点对象
    • xml的解析方式(技术):dom 和 sax  【这两种方式不是针对java语言来解析xml的技术,而是跨语言的解析方式。例如DOM还在javascript中存在!】 
      • DOM是W3C组织提供的解析XML文档的标准接口,而SAX是社区讨论的产物,是一种事实上的标准
      • DOM和SAX只是定义了一些接口,以及某些接口的缺省实现,而这个缺省实现只是用空方法来实现接口。一个应用程序如果需要DOM或SAX来访问XML文档,还需要一个实现了DOM或SAX的解析器,也就是说这个解析器需要实现DOM或SAX中定义的接口。提供DOM或SAX中定义的功能。

      • dom解析和sax解析区别:
        • dom方式解析
          • 根据xml的层级结构在内存中分配一个树形结构,把xml的标签,属性和文本都封装成对象
          • 缺点:如果文件过大,造成内存溢出
          • 优点:很方便实现增删改操作
        • sax方式解析
          • 采用事件驱动,边读边解析:从上到下,一行一行的解析,解析到某一个对象,返回对象名称
          • 缺点:不能实现增删改操作
          • 优点:如果文件过大,不会造成内存溢出,方便实现查询操作
    • xml解析器
      • DOM、SAX都是一组解析XML文档的规范,其实就是接口,这说明需要有实现者能使用,而解析器就是对DOM、SAX的实现了。一般解析器都会实现DOM、SAX两个规范
      • 不同的公司和组织提供了 针对dom和sax方式的解析器,通过api方式提供
        • sun公司提供了针对dom和sax解析器    jaxp
        • dom4j组织,针对dom和sax解析器    dom4j  【实际开发中使用最多】
        • jdom组织,针对dom和sax解析器    jdom

    八、jaxp的api的查看

      

    • jaxp是javase的一部分
    • jaxp解析器在jdk的javax.xml.parsers包里面
      • JDK_API中的javax.xml.parsers包里面有四个类:分别是针对dom和sax解析使用的类
        • dom:
          • DocumentBuilder  : 解析器类 【这个类是一个抽象类,不能new,此类的实例可以从 DocumentBuilderFactory.newDocumentBuilder() 方法获取】
            • 一个方法,可以解析xml , parse("xml路径")   返回的是 Document 整个文档。返回的document是一个接口,父节口是Node,如果在document里面找不到想要的方法,到Node里面去找
            • 在document里面方法 :
              • getElementsByTagName(String tagname) :这个方法可以得到标签,返回集合 NodeList
              • createElement(String tagName):创建标签
              • createTextNode(String data) :创建文本
              • appendChild(Node newChild) :把文本添加到标签下面
              • removeChild(Node oldChild) :删除节点
              • getParentNode() :获取父节点
              • NodeList :
                • getLength() 得到集合的长度
                • item(int index)下标取到具体的值
                  for(int i=0;i<list.getLength();i++){      //遍历
                     list.item(i)
                  }
              • getTextContent():得到标签里面的内容
          • DocumentBuilderFactory: 解析器工厂 【这个类也是一个抽象类,不能new,newInstance() 获取 DocumentBuilderFactory 的实例。】
        • sax:
          • SAXParser:解析器类
          • SAXParserFactory: 解析器工厂

     九、jaxp的dom方式操作

  • 相关阅读:
    数据结构之链表——加里森的任务(循环链表)
    数据结构之队列——回文字判断
    数据结构之栈——二进制转十进制
    《爱的艺术》人类超越了本能
    从一个Activity返回上一个Activity
    VS(C++)编程遇到的错误集合
    C++(MFC)编程一些注意事项
    Tomcat部署(进行web服务器开发)
    本地IP与宽带IP
    opencv的Mat图像显示在MFC控件中
  • 原文地址:https://www.cnblogs.com/drby/p/5548225.html
Copyright © 2011-2022 走看看