JavaWeb学习笔记--day05--day06--XML

1、xml的简介

* extensible Markup Language: 可扩展标记型语言 **标记型语言:html是标记型语言 -也是使用标签来操作 **可扩展: -html里面的标签是固定,每个标签都有特定的含义
-标签可以自己定义,可以写中文的标签<猫>

  • xml用途
    ** html是用来显示数据,xml也可以显示数据(不是主要功能〉
    ** xml主要功能,为了存储数据
  • xml是w3c组织发布的技术
  • xml有两个版本1.0 1.1
    -使用都是1.0版本,(1.1版本不能向下兼容)
2、xml的应用
*不同的系统之间传输数据 *用来表示生活中有关系的数据 *经常用在配置文件中 **比如现在连接数据库,肯定知道的数据库用户名和密码,数据名称 **如果修改数据库的倌息,不需要修改原代码,只要修改配置文件就可以了

3、xml的语法
(1) xml的文档声明(***)
*创建一个文件后铒名是.xml
*如果写xml,第一步必须要有一个文档声明 (写了文档声明之后,表示写xml文件的内容)
**
***文档声明必须写在第一行第一列
*属性
-version: xml的版本 1.0(使用)1.1
-encoding: xml编码 gbk utf-8 iso8859-1(不包含中文)
-standalone:是否需要依赖其他文件 yes/no
*xml的中文乱码问题解决
**保存时候的编码和设置打开时候的编码一致,不会出现乱码问题
4、xml的元素定义
**标签定义
**标签定义又开始必须要有结束: **标签没有内容,可以再标签内结束: **标签必须合理嵌套 **一个xml中只能有一个根标签 **xml中把空格和换行都当成内容来解析,下面两个代码含义不同 ***1111111 *** 1111111**xml可以是中文,但是不能css **xml中标签的命名规则 ***xml代码区分大小写 ***xml的标签不能以数字和下划线开头 ***xml的标签不能以xml、XML、Xml等开头 ***xml的标签不能包含空格和冒号

5、xml中属性的定义
*html是标记型文档,可以有属性
*xml也是标记型文档,可以有属性
* **属性定义的要求 (1)一个标签上可以有多个属性 (2)属性名称不能相同 (3)属性名称和属性值之间使用 = ,属性值使用引号(单双引号都可以)包起来 (4)xml属性命名规范和元素一致

【JavaWeb学习笔记--day05--day06--XML】6、xml中的注释
*
*注释不能嵌套,也不能放在第一行
7、xml中的特殊字符
*如果想要再xml中显示<,>,&,’,"需要用到转义字符
<< >> & & "" ''

8、CDATA区
*可以解决多个字符都需要转义的操作
*
9、PI指令(处理指令)
*可以在xml中设置样式
*写法:
*设置样式只能对英文标签名称起作用。
10、xml的约束
*为什么需要约束?规定xml中可以出现的元素
*xml的约束技术:dtd约束和schema约束
11、dtd的快速入门
*创建一个文件 后缀名 .dtd
步骤:
1.看xml中有多少个元素,有几个元素,在dtd文件中写几个
2.判断元素是简单还是复杂元素
-复杂元素:
--xml元素出现的顺序必须按照这个来
-简单元素:
顺序随意


3.需要在xml文件中引入dtd文件

**打开xml文件使用浏览器,浏览器只负责校验xml的语法,不负责校验约束
**校验xml约束,需要使用工具
**元素类型声明 -复杂元素: --xml元素出现的顺序必须按照这个来 -简单元素: 顺序随意 --电话号码,手机号码必须有一个 --电话号码,零个或者多个 --电话号码,一个或者多个 --电话号码,零个或者一个**实体类型声明:表示需要重复使用的数据,定义实体需要写在内部dtd里面, 如果写在外部的dtd里面,在某些浏览器下,内容得不到 一般实体: --- 实体名称 实体内容 &bank_name ---实体引用 参数实体(只能在dtd中引用): **使用dtd定义属性 *属性类型 -CDATA:字符串 -枚举:表示只能在一定范围内出现值,并且只出现其中一个 -ID:值只能是字母或者下划线开头 *属性的约束 -#REQUIRED:属性必须存在 -#IMPLIED:属性可有可无 -#FIXED:表示一个固定值 #FIXED "AAA" 只能是AAA -直接值:不写属性,使用直接值;写了属性,使用设置那个值。

12、dtd的三种引入方式
1.引入外部的dtd文件

2.使用内部的dtd文件



]>
3.使用外部的dtd文件(网络上的dtd文件)
(后面struts2中使用配置文件会用到)
xml的解析的简介(写到java代码)<今天最重要的内容)
  • xml是标记型文档
  • js使用dom解析标记型文档?
    -根据html的层级结构,在内存中分配—个树形结构,把html的标签,属性和文本都封装成对象
    -document对象、element对象、属性对象、文本对象、Node节点对象
  • xml的解析方式(技术) :dom 和 sax
    **画图分析使用dom和sax解析xml过程
    *** dom解析和sax解析区别: T
    ** dom方式解析
    *根据xml的?级结构在内存中分配一个树形结构,把xml的标签,属性和文本都封装成对象
    *缺点:如果文件过大,造成内存溢出
    *优点:很方便实现增删改操作
    ** sax方式解析
    *采用事件驱动,边读边解析
    -从上到下,一行一行的解析,解析到某一个对象,返回对象名称
    *缺点:不能实现增删改操作
    *优点:如果文件过大,不会造成内存溢出,方便实现査询操作
    *想要解析xml,苜先需要解析器 **不同的公司和组织提供了 针对dom和sax方式的解析器,通过api方式提供 *** sun公司提供了针对dom和sax解析器jaxp *** dom4j组织对dom和sax解析器dom4j(*** 实际开发中****) *** jdom组织,针对dom和sax解析器jdom

JavaWeb学习笔记--day05--day06--XML
文章图片

jaxp的api查看
**jaxp是javase的一部分 **jaxp解析器在jdk的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) --创建标签 appendChild(Node new Child) --把文本添加到标签下面 removeChild(Node oldChild) --删除节点 getParentNode() --得到父节点 NodeList list1 for(int i = 0; i

JavaWeb学习笔记--day05--day06--XML
文章图片

JavaWeb学习笔记--day05--day06--XML
文章图片

JavaWeb学习笔记--day05--day06--XML
文章图片

JavaWeb学习笔记--day05--day06--XML
文章图片

JavaWeb学习笔记--day05--day06--XML
文章图片

JavaWeb学习笔记--day05--day06--XML
文章图片

JavaWeb学习笔记--day05--day06--XML
文章图片

schema快速入门
*schema后缀名.xsd 根节点: ***在schema文件里* **属性xmlns="http://www.w3.org/2001/XMLSchema" 固定写法,表示是一个约束文件 **targetNamespace="http://www.w3school.com.cn"显示被此 schema 定义的元素来自此-命名空间。 **elementFormDefault="qualified"固定写法,表示在此 schema 中声明过的元素必须被命名空间限定 步骤: 1.看xml中有多少个元素就有多少个 2.复杂元素 子元素 3.简单元素,写在复杂元素里面 最常用的类型是: xs:string xs:decimal xs:integer xs:boolean xs:date xs:time ---默认值red ---固定值 **在被约束文件中引用约束文件 **xmlns:xsi 固定写法 表示xml是一个被约束文件,xsi是起的别名 **xmlns 约束文档里的targetNamespace **xsi:schemaLocation="targetNamespace 约束文档的url"

schema知识点
**简单元素: xxx 指元素的名称,yyy 指元素的数据类型,xs是前缀 属性: xxx是属性名称,yyy是属性的数据类型 默认值,fixed="EN" 固定值 use="required" 可选的常见数据类型 xs:string xs:decimal xs:integer xs:boolean xs:date xs:time **简单元素的限定 age 的值不能低于 0 或者高于 120 下面的例子定义了带有一个限定的名为 "car" 的元素。可接受的值只有:Audi, Golf, BMW:(枚举约束) 上面的例子也可以被写为:(在这种情况下,类型 "carType" 可被其他元素使用,因为它不是 "car" 元素的组成部分。) 定义了带有一个限定的名为 "initials" 的元素。可接受的值是大写或小写字母 a - z 其中的三个(模式约束 定义了带有一个限定的名为 "choice 的元素。可接受的值是字母 x, y 或 z 中的一个:

JavaWeb学习笔记--day05--day06--XML
文章图片

JavaWeb学习笔记--day05--day06--XML
文章图片

**复杂元素 有四种类型的复合元素: 空元素 包含其他元素的元素 John Smith 仅包含文本的元素 Ice cream 包含元素和文本的元素 It happened on 03.03.99 .... 写法一: 写法二:(这种写法多个元素可以通过type共用一个复杂类型)

sax解析
*解析xml有两种技术dom和sax -dom:根据xml层级结构在内存中分配一个树形结构 把xml中的标签,属性,文本封装成对象 *sax方式:事件驱动,边读边解析 *在javax.xml.parsers包中 **SAXParser 此类的实力可以从SAXParserFactory.newSAXParser()方法得到 -parse(File f,DefaultHandler dh) *第一个参数,xml的路径 *第二个参数:事件处理器

JavaWeb学习笔记--day05--day06--XML
文章图片

使用jaxp的方式解析xml
*sax方式不能是西安增删改操作,只能做查询操作 **打印出整个文档 执行parse(url,事件处理器)方法 创建一个类,继承事件处理器的类 重写里面三个方法 class MyDefault extends DefaultHandler{} saxParser.parse("student.xml", new MyDefault()); *获取到所有的name元素的值 定义一个成员变量 falg=false 判断开始方法是否是name元素,如果是name元素,把flag置true 如果flag是true,在characters方法里打印内容 执行到结束方法时候,把flag置false *获得第一个name元素的值 定义一个成员变量 idx=1 在结束方法中 idx自增1 想要打印第一个name元素的值,就在characters方法里面判断,如果flag==true&&idx==1,打印

使用dom4j解析xml
导入dom4j jar包--创建一个lib文件夹--复制jar包到lib下面--右键jar包->build path-add to buildpath 得到document SAXReader saxReader = new SAXReader(); Document document = saxReader.read("student.xml"); doucment中的找不到的方法去父接口Node中找 getRootElement() 获取根节点,返回Element Element也是一个接口,父接口是Node getParent():获取父节点 addElement:添加标签 element(qname)获取标签下面的第一个子标签,返回Element elements(qname)获取标签下面所有子标签(一层),返回List,用List接一下 elements()获得标签下面一层子标签,返回List 遍历List for(Element element : list){}增强for循环,第二个list元素 list.get(1); getText()得到内容,返回String在p1下面添加sex Element sex = p1.addElement("sex"); sex.setText("male"); 回写xml OutputFormat format = OutputFormat.createPrettyPrint(); //带格式化的 //OutputFormat format = OutputFormat.createCompactPrint(); //紧凑的 XMLWriter xmlWriter = new XMLWriter(new FileOutPutStream("student.xml"),format); xmlWriter.writer(document); //写入文件,返回布尔 xmlWriter.close(); 关闭流 特定节点添加(使用list的add方法添加特定位置的元素) List list = p1.elements(); //获得p1下的所有元素 Element school = DocumentHelper.createElement("school"); //创建元素 school.setText("中学"); //设置文本 list.add(1,school); //第二个位置插入,然后回写 获得父节点:getParent(); 删除节点:父节点.remove(element); 得到属性值:attributeValue("id"),返回String

使用dom4j支持xpath操作
*可以直接获取到某个元素 *第一种形式 /AAA/DDD/BBB:表示一层一层的,AAA下面的DDD下面的BBB *第二种形式 //BBB:表示只要名称是BBB的都得到 *第三种形式 /*:所有元素 *第四种形式 ** BBB[1]:表示第一个BBB元素 ** BBB[last()]:表示最后一个BBB元素 *第五种形式 ** //BBB[@id]:表示得到所有BBB上有id属性的元素 *第六种形式 **//BBB[@id='b1']:表示得到所有BBB上id属性为b1的元素 具体操作: **默认情况下,dom4j不支持xpath **想要在dom4j里面使用xpath,就要导入jar包(jaxen-1.1-beat-6.jar) **在dom4j里面提供了两个支持xpath的方法: *** selectNodes("xpath表达式") -获得多个节点 *** selectSingleNode("xpath表达式") -获得一个节点**使用xpath实现:查询xml中所有name元素的值 **所有name元素的xpath表示://name **步骤: //得到document SAXReader saxReader = new SAXReader(); Document document = saxReader.read("student.xml"); //得到所有name元素 List list = document.selectNodes("//name"); //遍历list集合 for(Node node : list){ //node是每一个name元素 //得到name元素里面的值 String s = node.getText(); syso(s); } **获取id为aaaa的p1下的name值 **xpath表示://p1[@id='aaaa']/name Node name = document.selectSingleNode("//p1[@id='aaaa']/name");

    推荐阅读