一、概述

  是什么? 指可扩展标记语言
  能干什么? 传输和存储数据
  怎么干? 需要自行定义标签。

  XML 独立于硬件、软件以及应用程序

  通常。建立完xml文件后首要的任务是:引入约束文件!

二、XML简介:可扩展标记语言,都是标记语言,通过标签来操作
  具有拓展性,标签为预定义,用户自定义标签(包括自己定义中文标签)
  HTML:显示数据。
  XML: 存储数据。(小型数据库)
  两个版本:1.0(主流) 1.1(兼容性差)
  用途:1.不同系统之间数据的传输(qq发送数据为例)
     2.表示生活中有关系的数据
     3.经常用在配置文件

三、XML的语法:

  1.文档声明

     <?xml version="1.0" encoding="gbk"?>
    注意格式与位置(必须第一行第一列)
    xmlns表示xml namespace
    中文乱码问题的解决:一般系统默认的编码方式为gbk,打开时使用另外的编码方式
    故出现乱码现象。解决方式是设置保存时候编码与打开方式编码相同:另存为时设置
    编码方式。
  2.元素的定义 
    A.有开始必须要有结束,必须成对出现。<person></person>
    【成对】在 XML 中,省略关闭标签是非法的。所有元素都必须有关闭标签
    标签没有内容,可以在标签内结束。<mytag/>
    可以合理嵌套
    只有一个根标签,其它都是子标签或是孙标签等。
    B.空格和换行都会当成原始内容处理
    <person>
    人 <person>人</person> 两种是不同的
    </person>
    C。命名规范:区分大小写(HTML不区分)
    不能以数字和_开头
    不能以xml XML等开头
    不能包含空格
    不能包含冒号:
    D.属性:一个标签可以有多个属性,但不能有相同的属性
    E.注释:同HTML <!-- -->,注释不允许嵌套。快捷键Ctrl shift /
    3.特殊字符
    如 < &lt; > &gt; " &quot; ' &apos & &amp类同HTML
    4.CDATA区:解决多个字符都需要转义的操作
    写法:<![CDATA[内容]]>
    5.PI指令(处理指令)
    对XML样式的设置,引入CSS样式等。但只能设置英文标签的样式
    6.XML约束:
  dtd约束(以看懂为准)
    创建.dtd文件约束,看xml中有几个元素,就在dtd中写几个<!ELEMENT>
    再判断是简单元素或者复杂元素(有无子元素等);复杂元素则表示为<!ELEMENT 元素名称(子元素)>
    如<!ELEMENT person(name,age)>:简单元素则表示为<!ELEMENT 元素名称(#PCDATA)>
    再引入dtd文件:<!DOCTYPE 根元素名称 SYSTEM "dtd文件路径">

            另一书根元素名称通常记录为dtd文件名称

    dtd三种引入方法:1.见上。文件引入
             2.使用内部dtd <!DOCTYPE 根元素名称 []>
        <!DOCTYPE note [
        <!ELEMENT note (to,from,heading,body)>
        <!ELEMENT to (#PCDATA)>
        <!ELEMENT from (#PCDATA)>
        <!ELEMENT heading (#PCDATA)>
        <!ELEMENT body (#PCDATA)>
        ]>
          3.使用外部dtd (网络上的dtd)
      <!DOCTYPE 根元素名称 PUBLIC "DTD名称" "DTD文档的URL"> (struts2框架应用)

        下载一个dtd文件后,复制第一行到xml文件即为成功引入,这里给出第一个接触用法的例子

          <!DOCTYPE hibernate-mapping PUBLIC
          "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
          "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

      使用dtd定义元素:<!ELEMENT 元素 约束>
      简单元素约束举例:<!ELEMENT name (#PCDATA)> 约束为字符串
      EMPTY 约束元素为空
      ANY 任意
      复杂元素约束举例:<!ELEMENT person (name,age)>
      name+:表示可以出现一次或者多次
      name?:表示出现0次或者1次
      name*:表示任意次数
      ,表示出现的顺序,
      name|age表示只能出现其中一个,或的关系
      使用dtd定义属性:<!ATTLIST 元素名称
      属性名称 属性类型 属性约束
      >
      属性类型一共三种 属性约束分类
      CDATA 字符串 #REQUIRED 必须出现的
      ENUM 枚举类型(aa|bb) #IMPLIED 可有可无
      ID类型 字母或者_开头 #FIXED "AA" 固定值,如AA
      直接值(没写则按照这个值)
      定义实体 <!ENTITY copyright "版权所有"> 引用 &copyright 一般写在内部dtd中
      W3C案例

  schema约束
    schema符合XML语法,不能像dtd一样语法自成一派。
    可以有多个schema,而dtd只能有一个。使用名称空间进行区分(类似包名进行区分)
    可以支持更多的数据类型(不止字符串#PCDATA类型)
    更复杂,约束更强大。

    创建一个schema文件 .xsd
    先看有多少个元素,就有多少个<element> 根元素 <schema></schema>
    w3c预定义了属性和标签 xmlns=""表明是一个约束文件 targetNamespace="url"可以通过这个地址进行引入
    看是简单或者复杂元素。
    复杂元素:<complexType>
    <sequence>
    子元素(就是下面的简单元素内容
    </sequence>
    </complexType>

    除了sequence 还可以有其它的:
    <all></all> 表示元素只能出现一次
    <choice></choice> 只能出现一个
    maxOccurs="unbounded" 元素出现次数无限制
    <any></any> 任意
    简单元素:<element name="name" type="string"></element>
    <element name="age" type="int"></element>

    在XML中引入schema文件,在xml根元素上面,<person xmlns="在schema的xmlns后加-instance"
    定义属性(必须是复杂元素)写在</complexType>之前
    <attribute name="id1" type="int" use="required"></attribute>

四、XML解析方式【重点】
js中的DOM解析方式为根据层级结构分配树形结构,标签、属性、文本都封装成对象

XML解析方式:DOM和SAX
  DOM:类同上述;树形结构容易完成增删改操作,但同时文件过大容易造成内存溢出
  SAX:采用事件驱动,边读边解析。解析到一个对象则返回该对象名称。
  容易查询,但不易于增删改操作
XML的解析器:不同公司提供了针对的解析器,以API文档形式给出。
   jaxp【sun公司提供】
  dom4j【实际开发使用最多】(XPath)
  jdom

  jaxp的API,属于SE部分,能在JDK中查到,javax.xml. parsers(解析)包
  主要包含以下类(操作会出现格式混乱的问题:
    dom:DocumentBuilder 解析器的类,抽象类(不能new)
    DocumentBuilderFactory.newDocumentBuilder()方法获得
    parse(string url)解析出整个文档document接口(父接口为Node)子接口中找不到方法时找父接口
    DocumentBuilderFactory 解析器的工厂
    newInstance();获取

    查询操作:
    得到工厂-》得到解析器-》得到Document-》document.getElementsByTagName()得到Nodelist,遍历等。
    getTextContent()得到具体值

    添加操作:
    得到Document及之前操作同上,创建需要添加的元素,类同js。得到父元素(拿到第一个.item(0))
    再进行操作,但此时操作的是内存里面的文档,最后要加一步回写。
    通过TransformerFactory 和Transformer(得到方法同上)
    再通过.transform(new DOMSource(document),new StreamResult("url"));方法回写

    修改使用setTextContent()方法;其它类同上。
    注意getElementsByTayName得到的是集合,要访问带.item(0)方法

    同样的删除操作使用父节点进行删除。

    采用递归进行遍历:访问自己。访问子节点。递归调用。
    判断元素类型再进行打印。

    sax:SAXParser 解析器类
    SAXParserFactory 解析器的工厂

    得到SAXParser实例类同上,使用的方法:parse(File,DefauleHander);
    参数一为xml的路径,参数二为事件处理器(自动执行这个事件)
    三个主要方法:startElement() :遇到开始标签自动执行此方法<start>
    endElement() :遇到结束时自动执行</start>
    characters():遇到文本时执行此方法 开始文本
    qName:把标签名返回

    使用dom4j解析XML,提供了解析器dom4j,由于dom4j是另外的组织开发的,不属于se的一部分。

      默认情况下dom4j是不支持XPATH的,第一步需要引入jar包:dom4j下lib/jaxen
    dom4j下提供两个方法支持XPATH,在document里调用
    selectNodes("xpath表达式");返回Node,强转成element
    selectSingleNode("xpath表达式");
    所以第一步当然是导包。创建一个folder,复制jar包,点击jar包右键build path>add to path>变成奶瓶的样子
    一般找docs就先看index.html,
    得到document的方法:
    SAXReader reader = new SAXReader();
    Document document = reader.read(url);
    document里面的方法:getRootElement();返回Element,也是接口(Node子接口)
    Element里面的方法:getParent():得到父节点 addElement():添加标签
    使用dom4j进行查询操作【XPath更方便】(增删改查操作)getText setText
    创建解析器SAXReader,read()方法得到document,
    得到根节点,getRootElement()
    得到一层层的标签直到需要的标签(从上到下解析)
    注意返回值,Element 与List<Element>
    element(qname)得到标签下面第一个name子标签
    elements()获取标签下面的一层子标签
    elements(qname)所有一层子标签
    使用dom4j进行元素末尾的添加操作(注意回写操作)
    得到根节点之前同上。
    得到P1,直接添加元素(不需要像前面一样先创建)
    Element sex1 = p1.addElement("sex"); sex1.setText("nv");
    使用这个类进行回写XMLWriter xmlWriter = new XMLWriter(OutputStream out, OutputFormat format)
    一个是输出流 new FileOutputStream(xml路径),一个是格式
    OutputFormat format = OutputFormat.createPrettyPrint();(是静态方法,直接类名调用,漂亮的格式,即有缩进的)
    最后加一个回写回去,xmlWriter.write(document);
    当然,流打开那必须关闭,xmlWriter.close();

    在特定位置添加元素,应该在上一级用Elements返回list,
    在list中使用list.add(index,element);需要创建一个用于添加
    使用documentHelper帮助类,使用createElement()静态方法 documentHelper.createElement();

    将部分代码封装到一个Utils类,封装成相关方法,常量如路径,
    表示成public static final String PATH = "";
    使用dom4j进行修改操作(重复部分使用封装的方法(得到Document)与回写与常量(路径等)等)
    得到需要的标签后,setText()即可。
    使用dom4j进行删除节点的操作,同样需要使用父节点进行删除,(可以使用getParent()方法获取父节点)
    方法与Js稍有区别,remove()进行删除

    【!】attributeValue()方法,得到属性值

    使用dom4j支持XPath的操作,可以直接获取到某一个元素,而不用一层一层解析,
    这里的XPath就类似于一种写法,一种表达式。详见手册前六实例。
    /AAA/DDD/BBB一个/表示一层一层
    //BBB每一层的BBB,不管哪一层都可以,只要名字相同
    /AAA/BBB/*表示BBB下所有的
    /AAA/BBB[1] 第一个BBB /AAA/BBB[last()] 最后一个BBB
    //BBB[@id] 选择有id属性的所有BBB元素
    //BBB[@id='b1'] 选择id属性为指定值的所有BBB

    

JavaWeb基础—XML学习小结的更多相关文章

  1. JavaWeb基础—JS学习小结

    JavaScript是一种运行在浏览器中的解释型的编程语言 推荐:菜鸟教程一.简介js:javascript是基于对象[哪些基本对象呢]和和事件驱动[哪些主要事件呢]的语言,应用在客户端(注意与面向对 ...

  2. JavaWeb基础—CSS学习小结

    重点记忆:四种结合方式 三种基本选择器 1.CSS:层叠样式表 相当于皮肤 提高了可维护性.样式与内容分离(注释格式/* */) 2.CSS与HTML结合的四种方式:内联式.嵌入式.外部式  1.每个 ...

  3. objective-c基础教程——学习小结

    objective-c基础教程——学习小结   提纲: 简介 与C语言相比要注意的地方 objective-c高级特性 开发工具介绍(cocoa 工具包的功能,框架,源文件组织:XCode使用介绍) ...

  4. JavaWeb基础: XML基础知识

    简介 XML:可扩展标记语言,W3C指定的用于描述结构化数据的语言,XML在实际开发中,经常用作软件的配置文件,以描述程序模块之间的依赖和组合关系. XML约束:XML常常用于软件配置管理,对于软件框 ...

  5. Hibernate入门篇<1>hibernate.cfg.xml学习小结

    Hibernate配置文件主要用于配置数据库连接和Hibernate运行时所需的各种属性,这个配置文件应该位于应用程序或Web程序的类文件夹 classes中.Hibernate配置文件支持两种形式, ...

  6. JavaWeb基础—MySQL入门小结

    一.数据库概述 RDBMS:关系型数据库管理系统 == 管理员(manager)+仓库(database) 常见数据库:  Oracle(神喻):甲骨文 MySQL: 归于甲骨文旗下(高版本系统已经开 ...

  7. 题解 P3870 【[TJOI2009]开关】/基础分块学习小结

    直接进入正题: 分块: 分块分块,就是把一个长串东西,分为许多块,这样,我们就可以在操作一个区间的时候,对于在区间里面完整的块,直接操作块,不完整的直接操作即可,因为不完整,再加上一个块本身就不大,复 ...

  8. JavaWeb基础: 学习大纲

    JavaWeb基础: Web应用和Web服务器 JavaWeb基础: Tomcat JavaWeb基础:HTTP协议和基于Restful的架构 JavaWeb基础: Web工程配置文件 JavaWeb ...

  9. 学习nodejs部分基础内容入门小结

    Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境. Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高效. Node.js 的包管理器 n ...

随机推荐

  1. Selenium clear()方法无法清掉数据

    问题描述 clear()方法执行过后, 数据还是在. 根本原因 存在镜像节点. 操作clear()清掉数据后, 镜像节点的数据还在, 就会再补充回去. 解决办法 添加下面代码就可以连同镜像的数据一起去 ...

  2. 指令-Directive

    restrict:'A'用作设定用那种方式使用指令. 可组合使用如restrict:'AE' E - 元素名称: <my-directive></my-directive> A ...

  3. HBase Scan流程分析

    HBase Scan流程分析 HBase的读流程目前看来比较复杂,主要由于: HBase的表数据分为多个层次,HRegion->HStore->[HFile,HFile,...,MemSt ...

  4. HBase 负载均衡

    HBase 可以根据当前集群的负载以region为单位进行rebalance.在HMaster中,后台会起一个线程定期检查是否需要进行rebalance,线程叫做BalancerChore.线程每隔  ...

  5. 使用FastCoder写缓存单例

    使用FastCoder写缓存单例 FastCoder可以存储字典,数组,鄙人将FastCoder封装,CoreData可以缓存的东西,用这个都可以缓存,但是只适合缓存少量的数据(不适合存储几万条数据) ...

  6. WinPE ISO制作

    1.安装ADK,然后导出winPE镜像文件和启动文件: 打开 部署和映像工具环境,cd "Windows Preinstallation Environment",运行 copyp ...

  7. HDFS NameNode内存全景

    一.概述 从整个HDFS系统架构上看,NameNode是其中最重要.最复杂也是最容易出现问题的地方,而且一旦NameNode出现故障,整个Hadoop集群就将处于不可服务的状态,同时随着数据规模和集群 ...

  8. September 14th 2017 Week 37th Thursday

    Don't let the past steal your present. 别让过去悄悄偷走了我们的当下. We take what we can get and make the best of ...

  9. MFC调试时可以,使用生产的exe时,显示未响应解决方案

    首先,使用release模式,生成解决方案和exe. 对生成的exe,选择属性,兼容性,win7,应用,即可解决. 此方法对debug无用

  10. 用asp连接Access数据库 制作简单登陆界面

    [题外话:最近做Internet作业,在这写一个适合初学入门的ASP连接ACCESS数据库做登陆界面的简单的例子,以慰藉我一口气把以前做过的系统中的PHP代码全改成ASP代码来临时应付作业的心情... ...