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属性命名规范和元素一致

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_第1张图片

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_第2张图片
JavaWeb学习笔记--day05--day06--XML_第3张图片
JavaWeb学习笔记--day05--day06--XML_第4张图片
JavaWeb学习笔记--day05--day06--XML_第5张图片
JavaWeb学习笔记--day05--day06--XML_第6张图片
JavaWeb学习笔记--day05--day06--XML_第7张图片
JavaWeb学习笔记--day05--day06--XML_第8张图片

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_第9张图片

JavaWeb学习笔记--day05--day06--XML_第10张图片

**复杂元素
  有四种类型的复合元素:
		空元素 
		包含其他元素的元素
		
		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_第11张图片

使用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");

你可能感兴趣的:(WEB学习)