Java-JavaWeb-XML

  • 简介
    • extensible markup language可扩展标记型语言
      • 可扩展:标签可以自定义,也可以写中文标签
    • 主要用于存储数据
    • 不同系统之间传输数据
    • 描述相互间有关系的数据
    • 常用于配置文件
  • 语法
    • 文档声明
      • <?xml version="1.0" encoding="gbk"?>
        • 必须写在第一行第一列
        • 属性:
          • version 值:1.0 1.1
          • encoding 值:gbk utf-8 iso8859-1(不包含中文)
        • 非常用属性:
          • standalone
            • 值:yes\no
            • 是否需要其他文档
    • 标签的定义
      • 类似Js
      • 一个XML中,有且只有一个根标签,其他标签都是这个标签下面的标签
      • 标签的内容:空格和换行会被当作代码内容解析
      • 标签名规则
        • 区分大小写
        • 不能以数字或下划线开头作为标签名
        • 不能以XML、xml等开头
        • 标签名中不能包含空格和冒号
      • 属性的定义
        • 一个标签上可以有多个属性,多个属性名不能重复
        • 属性与值之间使用=连接,值使用双引号括起,单引号也可以
        • 命名规则与XML的标签名命名规则一致
    • 注释
      • <!-- 注释-->
      • 注释不能有嵌套
    • 转义字符
      • < &lt;
      • > &gt;
      • " &quot;
      • ' &aqos;
      • & &amp;
    • CDATA
      • 内部内容无需转义
      • <![CDATA[ 内容 ]]>
    • PI 指令
      • 用于在XML中设置样式
      • 格式:第2行写:<?xml-stylesheet type="text/css" href="1.css"?>
      • 对中文标签不起作用
  • XML的约束
    • 用于添加对标签内容的约束(拒绝随意添加标签,如在人的属性中添加猫)
    • dtd约束
      • 定义 .dtd文件
        • 分析XML中有几个元素,对应dtd文件中的多少个<!ELEMENT>
        • 分析XML中的元素是复杂元素(有子元素)\简单元素(无子元素)
          • 复杂元素的约束:
            • <!ELEMENT person (name,age)>
          • 简单元素的约束:
            • <!ELEMENT name (#PCDATA)>
            • <!ELEMENT age (#PCDATA)>
      • 引入dtd约束
        • 引入 .dtd文件
          • <!DOCTYPE 根元素名称 SYSTEM “dtd文件的路径">
        • XML文件内直接写
          • <!DOCTYPE 根元素名称 [dtd语言]>
        • 引入外部dtd文件(网络文件)
          • <!DOCTYPE 根元素名称 PUBLIC "dtd名称" "dtd文档的URL">
      • 定义dtd元素
        • 语法:<!ELEMENT 元素名 约束>
        • 简单元素(没有子元素)
          • <!ELEMENT 元素名 约束>
            • 约束有:
              • (#PCDATA) 限制为字符串类型
              • EMPTY 无内容
              • ANY 任意类型
        • 复杂元素(有子元素)
          • <!ELEMENT 元素名称 (子元素名称)>
            • 子元素之间使用 , 隔开,那么子元素之间出现的顺序要与此一致
            • 子元素之间使用 | 隔开,那么子元素只能出现其中的任意一个
          • 用以下符号表示元素出现的次数
            • + 出现1次或者多次
            • ? 出现0次或者1次
            • * 出现0次或者多次
      • 定义dtd属性
        • 格式:<!ATTLIST 元素名称 属性名称 属性类型 属性的约束>
          • 例:<!ATTLIST name ID CDATA #REQUIRED>
        • 属性类型:
          • CDATA 字符串
          • 枚举 (A|B|C|D) 表示该属性必须在ABCD中取值
          • ID 只能是字母或者下划线开头
        • 属性的约束:
          • #REQUIRED该属性必须出现
          • #IMPLIED该属性可有可无
          • #FIXED"A" 该属性的值必须是A
          • 直接值 若在属性的约束 这个位置写"AA" 那么该属性如果不明确值的话,就会取值AA
      • 定义dtd实体
        • 格式:<!ENTITY TEST "HAHA"> <name>&TEST;</name>就可以将HAHA引入
        • 一般需要写在内部dtd文件中,外部文件中的实体的话,某些浏览器不支持
    • schema约束
      • 符合XML语法,XML语句
      • 一个XML中,可以有多个schema约束,使用名称空间进行区分,类似Java的包
      • 支持更多的数据类型,比如整数类型等,并支持自定义类型
      • 创建schema
        • 创建schema文件,后缀:xsd,其本身就是XML文件,第一行第一列要写XML的声明
        • 根节点<schema>,这个标签具有以下属性:
      • schema语法
        • 约束元素
          • <element name="person"> //复杂元素,含有子元素
            • <complexType>
            • <sequence>//表示元素按照以下顺序出现,另外还有其他约束,如:
              • //<all>表示只能出现一次
              • //<choice>表示只能出现以下元素中的一个
              • <element name="name" type="string"></element> //简单元素,无子元素
                • //可以在这个标签上添加属性:maxOccurs="unbounded" 表示无出现次数的限制
              • <element name="age" type="int"></element> //简单元素
            • </sequence>
            • </complex>
          • </element>
        • 约束属性
          • 书写位置:复杂元素标签包含的范围里,且在</coplexType>标签之前
          • 格式:<attribute name="id" type="int" use="required"></attribute>
            • name:属性名\ type:属性类型\ use:属性是否必须出现
      • 引入schema约束
        • 在XML文件的根元素上添加以下属性:
          • xmlns:xsi 值:xxx-instance
            • xsi只是自定义的一个别名,用于与下方的属性区别开,也用在引入了多个schema文件的情况,相当于给schema约束起名字
            • xxx就是schema文件中xmlns的值
          • xmlns
            • 它的值就是schema文件的targetNameSpace的值
          • xsi:schemalocation
            • 它的值的构成:targetNameSpace的值 空格 schema文档的路径
  • XML的解析
    • 2中解析方式:DOM SAX
    • DOM
      • 在内存中分配一个树形结构,将XML的每一个结构,都封装成对象,类似于Js对HTML的DOM操作
      • 很方便进行增删改操作
      • 文件很大时,可能造成内存溢出
    • SAX
      • 事件驱动,边读边解析,读到某个对象,就将此对象返回
      • 不能实现增删改,只能查询
      • 不会造成内存溢出
    • XML解析器
      • sun公司 jaxp
      • dom4j组织 dom4j (实际开发中使用)
      • jdom组织 jdom
  • jaxp
    • JavaSE的一部分,在 javax.xml.parsers包中
      • 针对DOM
        • 类:DocumentBuilder\DocumentBuilderFactory\Document\Node
        • 当对XML增删改的操作时,需要回写操作,使用:
          • Transformer\TransformerFactory\DOMSource\StreamResult
      • 针对SAX
        • 类:SAXParser\SAXParserFactory
        • 步骤
          • 1-创建解析器工厂
          • 2-创建解析器
          • 3-执行parse()方法
            • 2个参数,xml路径+事件处理器(自定义一个类继承DefaultHandler,并覆写以下3个方法)
            • 事件处理器:
              • 当解析到开始标签时,自动调用startElement方法,返回标签名
                • qName就是标签名,可以对其进行各种操作
              • 当解析到文本内容时,自动调用characters方法,返回内容
              • 当解析到结束标签时,自动执行endElement方法,返回标签名
  • dom4j
    • 逐行解析
    • 结合了dom和sax,既可以增删改,也可以查询
    • 不是JavaSE的一部分,如何导入dom4j的jar包?
      • 在MyEclipse环境:
        • 项目目录中创建一个lib文件夹
        • 复制jar包至lib文件夹
        • 右键点击此jar包->build path->add to build path
        • 导入成功
    • 一般步骤
      • 创建解析器
        • SAXReader reader=new SAXReader();
      • 得到document
        • Document doc=reader.read(url)
        • Document类的父接口是Node
      • 得到根节点 getRootElement(),返回的是Element
        • 多种获取节点的方法
        • Element中有一个getParent()方法
        • addElement()
        • setText()
      • 当对XML实施了增删改的操作后,需要回写操作,使用XMLWriter
      • 当需要创建一个元素时,可以使用DocumentHelper类中的静态方法createElement()方法
      • 当需要向某个位置上添加元素时,可以获取同辈元素的集合list,使用list的add()方法,添加后会自动影响document对象
    • XPATH
      • 可以直接获取某一个元素,不再需要逐行去解析
      • 常用语法:
        • /AAA/BBB/CCC
          • AAA下的BBB下的CCC
        • //BBB
          • 所有的BBB元素
        • /*
          • 所有元素
        • /AAA[1]
          • AAA下的第一个元素
        • /AAA[last()]
          • AAA下的最后一个元素
        • //AAA[@ID]
          • 选择具有ID属性的元素
      • 需要导入jar包,dom4j里提供了方法,可以应用xpath的表达式
        • selectNodes(xpath表达式)
        • selectSingleNode(xpath表达式)
posted @ 2018-09-12 20:46  wonewo  阅读(167)  评论(0编辑  收藏  举报