3.xml的应用
(1)不同系统之间传输数据
       qq之间数据的传输
       画图分析过程
(2)用来表示生活中有关系的数据
(3)经常用在配置文件中
       比如现在连接数据库,肯定要知道用户名和密码,数据名称等
       如果修改数据库的信息,不需要修改源代码,只要修改配置文件就可以了
 
4.xml的语法
(1)xml的文档说明
       创建一个文件,后缀名: .xml
      
如果写xml,第一步必须要有一个文档声明(写了文档声明之后,表示写xml文件内容)
       <?xml version=”1.0” encoding=”utf-8”?>
      
必须写在第一行第一列
      
属性:
              version: xml的版本  1.0  1.1
              encoding:  xml编码  gbk  utf-8
              standalone: 说明文档是否独立存在(很少使用)
      
xml乱码问题
              原因:保存文件的编码格式和xml的文档设置encoding编码不一致
(2)定义元素(标签)
(3)定义属性
(4)注释
(5)特殊字符
(6)CDATA区
(7)PI指令
 
5.xml的元素定义
       标签定义:
有开始必须要有结束 :
                    
标签没有内容,可以在标签内结束:
                    
标签可以嵌套,必须要合理嵌套
                                   合理嵌套:
                                   不合理嵌套:
                    
一个xml中,只能有一个根标签,其它都是子标签。
                    
 
 
 
在xml中把空格和换行都当成内容来解析,下面这两段代码含义是不一样的
                     
                     
                            1111
                     
 
标签的命名规则
(1)   代码区分大小写
(2)   不能以下划线和数字开头
(3)   不能以XML, xml, Xml开头
(4)   不能包含空格
(5)   可以是中文
 
6.xml中属性的定义
       xml是标记型文档,可以有属性。
例如:
 
属性定义的要求
       (1)一个标签上可以有多个属性            
              
       (2)属性名称不能相同  
(3)属性名称和属性值之间使用“=”,属性值用引号引起来(单引号,双引号)
       (4)属性名称的命名规则遵循标签的命名规则
      
7.xml的注释
       写法:<!—注释内容 —>
       注意:注释不能嵌套!
                注释也不能放在第一行第一列,第一行第一列必须放文档声明!
 
8.xml的特殊字符
       &            &
       <            <
       >            >
       ”             "
       ’             '
9.CDATA区
       可以解决多个字符都需要转义的操作   例如:if(af){}
       把这些内容放到CDATA区里面,则不需要转义了
       写法:
              <![CDATA[内容]]>
       作用:把特殊字符,当做文本内容,而不是标签。
10.PI指令(处理指令)  【了解】
              可以在xml中设置样式
              <?xml-stylesheet type=”text/css” href=”css的路径”?>
              设置样式,只能对英文标签名称起作用,对中文标签不起作用。
 
11.xml的约束
       任何根节点可以有任何子节点,并不符合实际。
       例如:
              
<猫>2132</猫>
son>
       xml的约束技术: dtd的约束  schema约束
 
12.dtd的快速入门
       (1)创建一个文件,后缀名:.dtd
       (2)看xml中有多少个元素,有几个元素,在dtd文件中就写几个 <!ELEMENT> 
按顺序
       (3)判断元素是简单元素还是复杂元素
                     复杂元素:没有子元素
                            <!ELEMENT 元素名称 (子元素)>
                     简单元素:有子元素的元素
                            <!ELEMENT 元素名称 (#PCDATA)>
      
(4)在xml文件中引入dtd文件
              <!DOCTYPE 根元素名称 SYSTEM “dtd文件路径”>
 
(5)使用浏览器打开xml文件,浏览器只负责校验xml的语法,不负责校验的约束
        如果说想校验xml的约束,需要使用工具。
 
13.dtd的三种引入方式
       (1)<!DOCTYPE 根元素名称 SYSTEM “dtd路径”>
       (2)引入内部的dtd文件
                     <!DOCTYPE 根元素名称[
            <!ELEMENT 根元素名称 (子元素名称1, 子元素名称2)>
            <!ELEMENT 子元素名称1 (#PCDATA)>
            <!ELEMENT 子元素名称2 (#PCDATA)>
]>
       (3)  使用外部的dtd文件(网络上的dtd文件)
                     <!DOCTYPE 根元素 PUBLIC “dtd名称” “dtd文档的URL”>
                     后面学到的struts2框架,使用配置文件  使用外部的dtd文件
14.使用dtd定义元素——-
       语法:<!ELEMENT 元素名称 约束>
      
简单元素:没有子元素的元素
       <!ELEMENT name (#PCDATA)>
              (#PCDATA) : 约束name是字符串
              EMPTY :    约束元素为空
              ANY :     任意  可为空可不为空
 
复杂元素:有子元素的元素
       <!ELEMENT 根元素名称 (子元素1,子元素2)>
              子元素只能出现一次
      
表示子元素出现的次数:
       +  : 子元素出现1次或者多次
       ?  : 子元素出现0次或者1次
                       : 子元素出现0次或者1次或者多次
             
子元素之间使用逗号“,”隔开,表示元素出现的顺序
子元素之间使用“|”隔开,表示根元素只能有其中的任意一个子元素
 
15.dtd定义属性
       语法:<!ATTLIST 元素名称
                               属性名称 属性类型 属性的约束
               <  
       属性的类型:
              CDATA : 字符串
                     <!ATTLIST name
            ID1 CDATA #REQUIRED
         >
              枚举  : 只能出现其中的一个  (aa|bb|cc)
                     <!ATTLIST age
            ID2 (AA|BB|CC) #REQUIRED
         >
      ID: 值只能是字母或下划线开头
                     <!ATTLIST birthday
            ID3 ID #REQUIRED
         >
   属性的约束:
      #REQUIRED 属性必须存在
      #IMPLIED  属性可有可无
      #FIXED    表示属性是一个固定值   #FIXED “AAA”   属性可有可无。
      直接值:  不写则为默认值,写了则修改。 属性可有可无。
 
16.dtd中实体的定义
   语法:<!ENTITY 实体名称 “实体的值”>
   使用:&实体名称;
   注意:定义的实体需要写在内部的dtd里面,如果写在外部的dtd里面,在某些浏览器下,内容得不到
 
17.xml的解析的简介(写到java代码)
   xml是标记型文档。js使用dom解析标记型文档。
   根据html的层级结构,在内存中分配一个树形结构,把html的标签,属性和文本都封装出对象。Document对象,element对象,Node节点对象,属性对象,文本对象。
  
   xml解析的技术: dom和sax
      dom解析:(根据xml的层级结构在内存中分配一个树形结构,把xml的标签,文本和属性都封装成对象)
            优点:方便实现增删改查
            缺点:容易造成内存溢出
      sax解析:(采用事件驱动,边读别解析) 从上到下,一行一行解析,解析到某个对象,把对象名称返回。
            优点:不会造成内存溢出,实现查询
            缺点:不能实现增删改的操作
  
   想要解析xml,首先需要解析器
   不同的公司和组织提供了 针对dom和sax方式的解析器 
(1)sun公司提供了针对dom和sax解析器    jaxp
(2)dom4j组织提供了针对dom和sax解析器  dom4j(实际开发中)
(3)jdom组织提供了针对dom和sax解析器   jdom
 
18.jaxp中的Dom的api的查看
     
      Dom解析器在jdk的javax.xml.parsers包里面
          四个类:分别是针对dom和sax解析使用的类
           
 Dom:
           DocumentBuilder  :  解析器
         (1)这个类是一个抽象类,不能new对象
此类的实例可以从DocumentBuilderFactory.newDocumentBuilder()方法获取
(2)Parse(“xml路径”)返回Document整个文档
返回的Document是一个接口,父接口是Node,如果在Document中找不到的方法,可以到Node中去找。
         (3)Documen类的方法:
               getElementsByTagName(String tagname)
                  得到标签,返回集合NodeList
              
NodeList的遍历:
      getLength(): 得到集合的长度
      item(int index):  返回Node节点
Node节点的方法:
      getTextContent():获取标签里面的内容
 
createElement(String tagName)
                  创建标签
               createTextNode(String data)
                  创建文本
           
Node类的方法:
               appendChild(Node newChild)
                  把文本添加到标签下面
               removeChild(Node oldChild)
                  通过父节点删除子节点
               replaceChild(NodenewChild,NodeoldChild)``通过父节点替换子节点getParentNode()``获取父节点`  <br />            DocumentBuilderFactory  : 解析器工厂<br />               这个类是抽象类,不能new对象<br />通过静态方法newInstance()来获取DocumentBuilderFactory的实例<br />              <br /> <br />19.使用jaxp中的Dom实现查询的操作<br />要求:打印所有name标签的内容  文件:person.xml<br />   代码实现:Jaxp.TestJaxp类的Test01()<br /> <br />20.使用jaxp中的Dom添加节点   <br /> <br />要求:<br />在第一个p1末尾添加<sex>nv</sex>   文件:person.xml<br />代码实现:Jaxp.TestJaxp类的Test02()<br /> <br /> <br /> <br />回写文件:<br />         Transformer : 抽象类,不能new对象<br />想要获取Transformer实例,TransformerFactory.newTransformer()获取。<br />方法:<br />transform(Source xmlSource,Result outputTarget)<br />(1)Source是接口,DomSource是其实现类。DOMSource(Node n)<br />(2)Result是接口,StreamResult是实现类。 [**StreamResult**]()([String]() systemId)`
        
TransformerFactory : 抽象类,不能new对象
      想要获取TransformerFactory实例,通过静态方法newInstance()获取
         
new DOMSource(document),new StreamResult(“src/person.xml”));
* 
21.使用jaxp中的Dom修改节点  
 
要求:修改第一个p1节点的sex子节点的内容     person.xml
代码实现:Jaxp.TestJaxp类的Test03()
  
setTextConetent() :  (设置)修改标签的内容 
 
22.使用jaxp中的Dom删除节点
 
   要求:删除第一个sex节点     person.xml
   代码实现:Jaxp.TestJaxp类的Test04()
    
23.使用jaxp中的Dom遍历节点
  
要求:把xml中的所有元素名称都打印出来   person.xml
   代码实现:Jaxp.TestJaxp类的Test05()
  
   getNodeName() :获取元素名称
   getNodeType() :判断是否是元素类型
      node.getNodeType()==Node.ELEMENT_NODE
 
24.schema约束
   schema符合xml语法,xml语句。
   一个xml中只能有一个dtd约束,但是可以有多个schema,多个schema使用名称空间区分(类型java包名)
   schema可以支持更多的数据类型。
   schema语法更加复杂,schema目前不能替代dtd
 
25.schema的快速入门
   创建一个schema文件   后缀名: .xsd
   根节点: 
   根节点属性:
         xmlns=http://www.w3.org/2001/XMLSchema
         表示当前xml文件是一个约束文件
         targetNamespace=http://www.itcast.cn/20151111
         使用schema约束文件,直接通过这个地址引入约束文件
         elementFormDefault=”qualified”
  
   步骤:
      (1)看xml有多少个元素   
      (2)看简单元素和复杂元素
               如果是复杂元素:
                     
                        
                           子元素
                        
                     
      (3)简单元素,写在复杂元素
            
                  
                  
               <element name=
               <element name=“age” type=“int”>
            
      (4)在被约束文件里面引入schema约束文件
   <person xmlns:xsi=[_http://www.w3.org/2001/XMLSchema-instance](http://www.w3.org/2001/XMLSchema-instance)
         — 表示xmls是一个被约束文件
 
xmlns=http://www.example.org/1
— 约束文档里面的targetNamespace
 
xsi:schemaLocation=“http://www.example.org/1 1.xsd”>
— targetNamespace(空格) 约束文档的地址路径
 
额外知识:
      
  
      定义复杂元素的属性:
        写在上面。
         
            use:修饰属性是否要出现
                  required : 必须出现
 
 
26. jaxp中的Sax的api的查看
   jaxp解析:在java.xml.parsers包里有2个类
(1)   SAXParser  :解析器
抽象类,不能new对象。
实例由SAXParserFactory.newSAXParser()方法获得
—parse(File f,DefaultHandler dh)
    第一个参数:xml的路径
    第二个参数:事件处理器
当把事件处理传递进来,相当于在方法里面绑定了一个事件,自动执行事件,自动执行方法
(2)   SAXParserFactory :解析器工厂  
抽象类,不能new对象。
实例由newInstance()``方法获得
     
      DefaultHandler类中的三个方法:事件自动执行以下方法(1)startElement(Stringuri,StringlocalName,StringqName,Attributesattributes)
接收元素开始的通知
qName: 标签名称
      (2)endElement(Stringuri,StringlocalName,StringqName)``接收元素结束的通知
(3)characters(char[] ch, int start, int length)
接收元素中字符数据的通知
返回文本的内容
new String(ch,start,length)
 
27.使用Jaxp中的Sax解析xml
   sax方式不能实现增删改操作,只能做查询操作
   步骤:
1.  创建解析器工厂
2.  创建解析器
3.  执行parse方法
4.  自己创建一个类,继承DefaultHandler
5.  重写DefaultHandler中的startElement,endElement,characters方法
 
案例1:打印出整个文档
代码实现:Jaxp.TestSax类.Test01()
  
案例2:打印所有同名标签的值
代码实现:Jaxp.TestSax类.Test02()
 
28.使用dom4j解析xml
    得到Document:
            SAXReader reader=new SAXReader();
            Docuoment document=reader.read(url);
      Document是一个接口,父接口是Node.
      Document的方法: getRootElement(): 获取根节点,返回的是Element
  
      Element也是一个接口,父接口是Node.
         Node的方法:
                  getParent(): 获取父节点
                  addElement() : 添加标签
         Element的方法:
         element(qname)
获取标签下面的第一个子标签
qname:标签名称
elements(qname)
获取标签下面是这个名称的所有子标签(一层)
qname:标签名称
elements()
   获取标签下面的所有一层子标签
获取标签下面的所有一层子标签
 
29.使用dom4j查询xml
   案例1:查询所有name元素的值     person3.xml
   步骤:
1.  创建解析器
2.  得到Document
3.  得到根节点
4.  得到所有的p1标签
5.  得到name
6.  得到name里面的值
代码实现:Dom4j.Test01类
 
案例2:查询第一个name元素的值     person3.xml
步骤:
1.  创建解析器
2.  得到Document
3.  得到根节点
4.  得到第一个p1标签
5.  得到第一个p1下的name元素
6.  得到name里面的值
代码实现:Dom4j.Test01类
 
30. 使用dom4j添加元素
   案例1:在第一个p1标签末尾添加一个元素
   代码实现:Dom4j.Test02类
   步骤:
1.  创建解析器
2.  得到Document
3.  得到根节点
4.  得到第一个p1标签
5.  在p1下面添加元素
6.  在添加完成后的元素下添加文本
7.  回写xml
 
31.使用dom4j在特定位置添加元素
案例1:在第一个p1下面的age标签之前添加
person3.xml
   代码实现:Dom4j.Test03类
   步骤:
1.  创建解析器
2.  得到Document
3.  得到根节点
4.  得到第一个p1标签
5.  获取p1下面的所有元素
elements()获取所有元素,返回list集合
创建元素DocumentHelper.createElement(“元素名”)
使用list里面的方法,在特定位置添加元素
6.  回写xml
 
32.使用dom4j修改节点的操作
   案例1:修改第一个p1下面的age元素的值    person3.xml
   代码实现:Dom4j.Test04类
   步骤:
1.  创建解析器
2.  得到Document
3.  得到根节点
4.  得到第一个p1标签
5.  得到第一个age元素
6.  修改值为30
7.  回写xml
 
33.使用dom4j删除节点的操作
   案例1:删除第一个p1下面的第一个sex元素    person3.xml
   代码实现:Dom4j.Test05类
   步骤:
1.  创建解析器
2.  得到Document
3.  得到根节点
4.  得到第一个p1标签
5.  得到第一个sex元素,并通过父节点删除子节点
6.  回写xml
 
34.使用dom4j来获取元素的属性值
   案例1:打印第一个p1的id1属性的值   person3.xml
   代码实现:Dom4j.Test06类
  
35.使用dom4j支持xpath的操作          
   可以直接获取到某个元素,不需要一层一层的解析
   (1)/AAA/DDD/BBB : AAA下面的DDD下面的BBB
   (2)//BBB : 名称是BBB的所有元素
   (3)/AAA/BBB/ : 在AAA下面的BBB下面的所有元素
   (4)// :  所有元素
   (5)BBB[1] : 第一个BBB元素
       BBB[last()] :最后一个BBB元素
   (6)//BBB[@id] : 有id属性的所有BBB元素
 
36.使用dom4j支持xpath具体操作
   默认情况下,dom4j是不支持xpath。需要导入jaxen.jar (dom4j.lib)
   在dom4j里面提供了两个方法,支持xpath.
      selectNodes(“xpath表达式”)
         获取多个节点
      selectSingleNode(“xpath表达式”)
         获取一个节点
  
案例1:使用xpath查询xml中所有name元素的值   person3.xml
代码实现:Dom4j.Test07类
 
37.实现简单的学生管理系统
   代码实现:Project包的所有代码
 
