XML高级使用指南

 一、XML语法:
 一个XML文档包含一下部分:
  文档声明:<?xml version="1.0" encoding="GB2312" ?> 
  元素: XML中出现的标签,只有一个根标签!其它的都是子孙标签!!
   最好不要带空格和回车,否则这也会被记录起来!正确代码:<网址>www.itcast.cn</网址>
  属性: 一个标签可以有多个属性,例如:<input name=“text”>
  注释:   注释不能嵌套。 <!--注释内容-->
  CDATA区: 编写的XML文件,有些内容不想让解析引擎解析执行,当成原始数据处理(直接输出)
   ,把这些内容放在CDATA中。例如:
   <![CDATA[   
    <itcast>
     <br/>
    </itcast>
   ]]>
  特殊字符: 你懂的!哈哈!  只有五个。
   枚举法:
   &  -->&amp;   
   <  -->&lt; 
   >  -->&gt; 
   “  -->&quot;  
   ‘  -->&apos;
  处理指令:PI,指挥解析引擎如何解析XML文档内容!例如:
   <?xml-stylesheet type=”text/css" href="1.css" ?> 通知XML解析引擎,应该用css文件显示xml文档内容!
   处理指令的格式是 <?  开头,  ?> 结尾!  XML声明语句是最常见的处理指令!
二、XML约束
 1.解析XML文档的解析器叫做parser, 只有遵循约束的文档才叫做有效的!
 2.约束就是编写一个文档约束一个XML的书写规范就叫做XML约束!
 3.约束规定了XML的元素名字,属性,以及顺序!
 4.我们常用的约束是  XML  DTD 约束 和XML Schema(这个约束更为严格,等会是肯定有比较的!)
 5.DTD约束称为  文档类型定义(Document Type Definition) !可以参考PPT中的范例看看!
 6.校验XML文档的正确性!有一个小工具,参考PPT中的测试方法!
 7.DTD的约束两种约束方式: 单独编写 和 在XML中编写!
     8.使用DOCTYPE 声明语句的两种形式:
  引用本地的,例如:<!DOCTYPE 书架  SYSTEM “book.dtd”>
  引用公共的,例如:
   <!DOCTYPE web-app PUBLIC
    "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">
 9.DTD约束语法细节
  01.元素定义: <!ELEMENT 元素名称 元素类型>
       元素类型可以是元素内容或类型
                      如果是内容用括号,
                              是类型,直接写!
     <!ELEMENT 书架 (书名,作者,售价)>
    <!ELEMENT 书名 (#PCDATA)>
    
    只有两种类型: EMPTY:定义为空元素
             ANY:任意类型!
   1)  <!ELEMENT MYFILE (TITLE,AUTHOR,EMAIL)>    用逗号分隔,表示内容的出现顺序必须与声明时一致!
   2)  <!ELEMENT MYFILE (TITLE|AUTHOR|EMAIL)>    用    |    隔开,表示任选其一  ,即多个只能出现一次!
   3)   在元素内容中也可以使用 +,* ,? 等符号表示元素出现的次数! 
    用圆括号()   +:一次或者多次(书+)  
           ?:0次或者一次 (书?)
            * :0次或者多批量设置,例如:<!ELEMENT MYFILE ((TITLE*, AUTHOR?, EMAIL)* | COMMENT)>
  02.属性定义: XML文档中的标签属性需通过ATTLIST为其设置属性
      语法:  <!ATTLIST    元素名   例子:         对应XML文件:
      属性名1   属性类型   设置说明  <!ATTLIST 商品    <商品 类别="服装" 颜色="黄色">…</商品>                                                                                                          
      属性名1   属性类型   设置说明  类别 CDATA #REQUIRED    <商品 类别="服装">…</商品>                                                                                                                      
           颜色  CDATA #IMPLIED                                                                                                                                                                    
      .........                                                                                                                                                                                                                         
      >     >                                                                                                                                                                                   
       
    属性的设置好说明:       #REQUIRED  是必须设置的属性
          #IMPLIED   是可以设置也可以不设置
          #FIXED     是设置一个固定的值
          直接使用默任值      可设置也可以不设置,如果没有设置就使用默认值!    
     
     举例说明:
            <!ATTLIST 页面作者
            姓名 CDATA #IMPLIED
            年龄 CDATA #IMPLIED
            联系信息 CDATA #REQUIRED
            网站职务 CDATA #FIXED "页面作者"
            个人爱好 CDATA "上网"
             >
         常用属性值类型:
          CDATA:表示属性值为普通文本字符串
          
          ENUMERATED:(DTD中没有此关键字) 枚举,只能选择一个!
            示例:
      <?xml version = "1.0" encoding="GB2312" standalone="yes"?>       
     <!DOCTYPE 购物篮 [
      <!ELEMENT 肉 EMPTY>
      <!ATTLIST 肉 品种 ( 鸡肉 | 牛肉 | 猪肉 | 鱼肉 ) "鸡肉">
     ]>
     <购物篮>
      <肉 品种="鱼肉"/>
      <肉 品种="牛肉"/>
      <肉/>
     </购物篮>
    
    
    ID: 属性的设置值为唯一的一个值,   ID属性的值只能由字母,下划线开始,不能出现空白字符,如果是数字那就错了,你做好再验证一下!<参考PPT吧!>
     
          ENTITY(实体):实体用于为一段内容创建一个别名,以后在XML文档中就可以使用别名引用这段内容了!
                      在DTD中定义用<!ENTITY>  定义实体!
           实体分为两种类型:引用实体和参数实体!
  
  03.实体定义:
   引用实体: 在XML文档中被应用。
      <!ENTITY   实体名称   “实体内容”>:直接转变成实体内容
      引用方式: &实体名称;
      举例:
       <!ENTITY  copyright   "I am a programmer">
          ......
         
          &copyrigth;
   
     <?可以吗?,查查!>另一种方式:<!ENTITY 实体名称 SYSTEM “外部XML文档的URL” >:用一个文档所实体
   
   参数实体:   参数实体被DTD文件自身使用。
     <!ENTITY  %  实体名称    “实体内容”>        (其实就是比引用实体多了一个百分号而已!)
      引用方式:      %实体名称;
     
      例子:
       <!ENTITY % TAG_NAMES "姓名 | EMAIL | 电话 | 地址">
                                                    <!ELEMENT 个人信息 (%TAG_NAMES; | 生日)>              
                                                    <!ELEMENT 客户信息 (%TAG_NAMES; | 公司名)>       
                                                 
                                                                                                  
                                           举例2:                                                      
                                           <!ENTITY % common.attributes                                 
                                             " id ID #IMPLIED                                     
                                            account CDATA #REQUIRED "                             
                                           >                                                            
                                           ...                                                          
                                           <!ATTLIST purchaseOrder %common.attributes;>                 
                                           <!ATTLIST item %common.attributes;>    
三、 XML 编程(CRUD)
 XML解析方式分为:dom 和 Sax ,XML解析开发包:daxp,jdom,dom4j.
       
        1.JAXP: 程序员调用javax.xml.parsers包中的工厂类,可以得到对xml文档解析的DOM或SAX的解析对象!
                包中的DocumentBuilderFactory用于创建DOM模式的解析器对象,是一个工厂类,不能实例化,但可以newInstance()方法,
                这个方法可以根据本地平台默认安装的解析器,自动创建一个工厂对象,并返回!
               
                获得JAXP中的DOM解析器:
                        01.调用DocumentBuilderFactory.newInstance(),创建DOM解析器的工厂!
                        02.调用工厂对象的newDocumentBuilder方法得到DOM解析器对象。
                        03.调用DOM解析器的对象的parse()得到整个文档的Document对象,就可以利用DOM特性对整个XML文档进行操作了!
       
        2.DOM模型:
                        DOM解析器在解析XML文档时,会把文档中的所有元素,按照其出现的层次关系,解析成一个个Node对象(节点)。
               
                在DOM中,节点之间的关系:
                01.位于一个节点之上的节点是该节点的父节点(parent)
                02.同理,之下为子节点(children)
                03.在同层次的节点是兄弟节点(sibling)
                04.节点的下一个层次的节点集合是节点后代(descendants)
                05.父、祖节点及所有节点上面的,都是节点的祖先(ancestors)
            
             节点类型 Node对象
                        1.Node对象提供了一系列常量来代表结点的类型,当开发人员获得某个Node类型后,就可以把Node节点转换成相应节点的0对象(Node的子类对象)(不是很明白!对看看)
                        2.Node对象提供了相应的方法去获得它的父结点和子结点。   
                                编程人员可以通过这些方法就可以读取整个XML文档的内容、或添加、修改、删除XML文档的内容了具体修改方法!
                                        (可以在API中看到,今天晚上一定要把这个练习练习!)
               
        3.DOM方式解析XML文件
                DOM解析编程:
                        01.遍历所有节点
                        02.得到某个具体节点内容
                        03.修改某个节点的内容
                        04.向指定节点中添加子节点
                        05.向指定点上添加同级节点
                        06.删除指定节点
                        07.操作XML文件属性
                        (对于以上这些知识,你必须打代码练习!)
       
        4.更新XML文档
                1.java.xml.transform包中的Transformer类用于把代表XML文件的Document对象转换成某种格式后进行输出
                        ,例如把xml文件用样式表转换成一个html文档,利用这个对象,当然也可以把Document对象又重新写入到XML文件中!
                2.Transformer类通过transfrom方法完成转换操作,该方法接受一个源和一个目的地!
                        javax.xml.transform.dom.DOMSource 类来关联要转换的document对象。
                        用java.xml.transform.strean.StreamResult对象来表示数据的目的地
      
       5.SAX解析
                1.在使用DOM解析XML文档的时候,读取整个XML文档,在内存中构架代表整个DOM树的Document对象,然后对XML文档操作。如果
                        文档很大,就好消化计算机大量的内存!
                2.SAX解析可以读取一部分解析一部分。
               
                SAX采用 事件处理 的方式解析XML文件,利用SAX解析XML文档,涉及两个部分:
                        解析器和时间处理器:
                                01.用JAXP的API创建出SAX的解析器后可以解析XML文档
                                02.用SAX方式解析出XML的一部分时,都会调用事件处理器的一个方法。解析器调用方法时会把当前解析到的
                                        XML文件内容的  作为 方法的参数   传递给事件处理器。             
                                03.程序员编写事件处理器,可以轻松得到sax解析器解析的数据,可以对数据进行合适的处理
               SAX解析:  SAXParserFactory --->  SAXParser -->  xml --> SAXReader
                                常用方法: startElement,endElement,characters
                                       01.startElement(String uri, String localName, String qName, Attributes atts)
                                                接收元素开始的通知。
                                       02.endElement(String uri, String localName, String qName)
                                                接收元素结束的通知。
                                       03.characters(char[] ch, int start, int length)
                                                接收字符数据的通知。
               SAX方式解析XML文档:
                                SAXParserFactory spf = SAXParserFactory.newInstance();          使用 SAXParserFactory创建SAX解析工厂
                                SAXParser sp = spf.newSAXParser();                              通过SAX解析工厂得到解析器对象
                                XMLReader xmlreader = sp.getXMLReader();                        通过解析器对象得到一个XML解析器
                                xmlReader.setContentHandler(new BOOKParserHandler());           设置读取器的事件处理器
                                xmlReader.parser("");                                           解析xml文件
                                                     public Document parse(File f)f - 包含要解析的 XML 的文件。
       
        6.DOM4j解析XML文档
                        01.Dom4J使用接口和抽象基类,是开源代码库,API复杂,但比JDOM 更灵活!
                        02.Dom4j是非常优秀的Java XML API!
                        03.Dom4j需要下载Dom4j 相应的jar文件
                Document 对象:
                        01.读取XML文件,获得document对象
                                SAXReader reader = new SAXReader();
                                Document document = reader.read(new File("input.xml"));
                        02.解析XML形式的文本,得到document对象。
                                String text = "<members></members>";
                                Document document = DocumentHelper.parseText(text);
                        03.主动创建document对象。
                                Document document = DocumentHelper.createDocument();
                                //创建根节点
                                Element root = documentaddElement("members");
       
        7.节点对象:
                        01.获取文档的根节点
                         Element root = document.getRootElement();
                        02.取得某个节点的子节点
                         Element element = node.element("书名");
                        03.取得节点的文字
                         String text = node.getText();
                        04.取得某个节点下所有名为“member”的子节点,并进行遍历
                         List nodes = rootElements("member");
                         for(Iterator it = nodes.iterator();it.hasNext();){
                          Element elm = (Element)it.next();
                          //do something
                         }
                        05.对某节点下的所有子节点进行遍历
                         for(Iterator it = root.elementIterator();it.hasNext();){
                         Element element = (Element)it.next();}
                        06.在某节点下添加子节点
                         Element ageElm = newMeMberElm.addElement("age");
                        07.设置节点文字。
                         element.setText("19");
                        08.删除节点
                         //childElm 是待删除的节点, parentElm 是其父节点
                         parentElm.remove(childElm);
                        09.添加一个CDATA节点
                         Element contentElm = infoElm.addElement("content");
                         contentElm.addCDATA(diary.getContent());
        
         8.节点对象属性
                  1.取得某节点下的某个属性
                   Element root = document.getRootElement();
                   //属性名name
                   Attribute attribute = root.attribute("size");
                        2.取得属性的文字
                         Sting text = attribute.getText();
                        3.删除某 属性
                         Attribute attribute = root.attribute("size");
                         root.remove(attribute);
                        4.遍历某节点的所有属性
                         Element root = document.getRootElement();
                         for(Iterator it = attributelterator(); it.hasNext();){
                          Attribute attribute  = (Attribute) it.next();
                          String text = attribute.getText();
                          System.out.println(text);
                         }
                        5.设置某节点的属性和文字
                         newMemberElm.addAttribute("name","sitinspring");
                        6.设置属性的文字
                         Attribute attribute = root.attirbute("name");
                         attribute.setText("sitinpring");
      
        9.将文档写入XML文件
         1.文档为英文,不用设置编码,直接写入的形式
          XMLWrite writer = new XMLWriter(new FileWriter("output.xml"));
          writer.writer(document);
          writer.close();
         2.文档包含中文,设置编码格式写入
          OutputForMat format = OutputFormat.createPrettyPrint();
          //指定XML编码
          format.setEncoding("GBK");
          XMLWriter writer = new XMLWriter(new FileOutputStream("output.xml",format);
          writer.writer(document);
          writer.close();
      
       10. Dom4j 在指定位置插入节点
         1.得到插入位置的节点列表(list)
         2.调用list.add(index,element),由index决定Element的插入位置
         3.Element元素可以通过DocumentHelper对象得到:
          Element aaa = DocumentHelper.createElement("aaa");
          aaa.setText("aaa");
          
          List list = rootelement("书").elements();
          list.add(1,aaa);
      
       11. 字符串与XML的转换
         1.将字符串转换成为XML
          String text = "<members><member>sitinpring</member></members>"
          Document document = DocumentHelper.parseText(text);
         2.将文档或节点的XML转换为字符串
          SAXReader reader = new SAXReader();
          Document document  = reader.read(new File("input.xml"));
          Element root = document.getRootElemt();
          
          String docXmlText = document.adXML();
          
          String rootXmlText = root.asXML();
          Element memberElm = root.element("member");
          String memberXmlText= memberElm.adXML();
      
       12. XMl Schema:  定义和描述XML文档的结构与内容的模式语言,其出现是为了克服DTD的局限性!
         只说几方面吧:
          1.XML Schema 符合XML语法结构
          2.DOM,SAX 等XML API 很容易解析出 XML Schema 文档中的内容
          3.XML Schema 对 名称空间 支持的很好
          4.支持自定义新的数据类型
          5.约束能力强大,可对XML实例文档作出细致的语义限制
          6.XML逐渐取代DTD, 不能定义实体, 比DTD更复杂!
       
        13.Schema约束快速入门:
         1.XML Schema就是一个 XML文档,扩展名为:.xsd
         2.一个XML Schema 文档就是 模式文档 (约束文档), 遵循这个文档的书写就是  实例文档!
         3.XML Schema 文档也必须有一个根结点,但是这个根结点的名,叫做:Schema
         4.编写XML Schema (约束文档)后, 把声明的元素 绑定到 URI (专业术语是   名称空间)地址上,XML文件可以通过 名称空间 告诉解析引擎,XML 编写的元素来自哪里,被谁约束!
          Schema 入门案例:
          
          <?xml version="1.0" encoding="UTF-8" ?>                                                             
                 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"                                               
                        targetNamespace="http://www. itcast.cn"                 
                        elementFormDefault="qualified">                         
                         <xs:element name='书架' >                                                                  
                          <xs:complexType>                                                                  
                           <xs:sequence maxOccurs='unbounded' >                                      
                            <xs:element name='书' >                                           
                             <xs:complexType>                                          
                              <xs:sequence>                                     
                               <xs:element name='书名' type='xs:string' />
                               <xs:element name='作者' type='xs:string' />
                               <xs:element name='售价' type='xs:string' />
                              </xs:sequence>                                    
                             </xs:complexType>                                         
                            </xs:element>                                                     
                           </xs:sequence>                                                            
                          </xs:complexType>                                                                 
                         </xs:element>                                                                             
                        </xs:schema>   
                       
                        自我感觉不是很懂!还是练练!
                       
       
        14.再一个更简单的例子:        
           <?xml version="1.0" encoding="UTF-8"?>                                                                                                                   
                                                                                    
                         <itcast:书架 xmlns:itcast="http://www.itcast.cn"                                    
                             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                             xsi:schemaLocation=“http://www.itcast.cn book.xsd">
                                                                                    
                          <itcast:书>                                                                 
                           <itcast:书名>JavaScript网页开发</itcast:书名>                       
                           <itcast:作者>张孝祥</itcast:作者>                                   
                           <itcast:售价>28.00元</itcast:售价>                                  
                          </itcast:书>                                                                
                         </itcast:书架>  
       
        15.名称空间的概念
             在XML Schema 中,每个约束的文档都可以被赋予 唯一的 名称空间 ,名称空间用一个唯一的URI(统一资源标识符)表示。在XML文件中,标签 可以通过 名称空间声明 表示,
              来声明当前编写的标签来自那个Schema约束文件:
               例如:
               
               <itcast: 书架 xml:itcast = "http://www.itcast.cn">
                <itcast:书>........</itcast:书>
               </itcast:书架>  
               
               此处使用的itcast来指向声明的名称,以便对后面的   名称空间的 引用!
               
             注意:
                   名称空间的名字语法容易让人混淆,尽管以http://开始,那个 URL 并不指向一个包含的模式定义的文件。
                   事实上,这个URL:http://www.itcast.cn 根本没有指向任何文件,只是一个分配的名字而已!
        16.使用名称空间引入Schema
         01.为了声明XML文档遵循Schema文件的具体位置,通常在XML文档中的根节点中用schemaLocation属性来指定:
          <itcast:书架 xmlns:itcast="http://www.itcast.cn">
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.itcast.cn book.xsd">
         02.schemalLocation 此属性有两个值。
          第一个是命名空间  
          第二个是供命名空间使用的XML Schema的位置,
          
          两者之间使用空格分隔!
         
         03. 注意: 在使用schemaLocation属性时,也需要指定该属性来自哪里!
       17.使用默认名称空间:
         基本格式:
          xmlns="URI"
         举例:
          <书架 xmlns="http://www.it315.org/xmlbook/schema"
           xmls:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.itcast.cn book.xsd">
           <书>
     <书名>JavaScript网页开发</书名>                                   
     <作者>张孝祥</作者>                                               
     <售价>28.00元</售价>                                              
    </书>                                                             
   <书架>                                                                    
        18.使用名称空间引入多个XML Schema文档
         
         文件清单:xmlbook.xml                                                                                                           
                <?xml version="1.0" encoding="UTF-8"?>                                                                                          
                                                                                                                                                                                                                   
         <书架 xmlns="http://www.it315.org/xmlbook/schema"                                                                                                                                                      
                 xmlns:demo="http://www.it315.org/demo/schema"                                                                           
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"                                                                   
                 xsi:schemaLocation="http://www.it315.org/xmlbook/schema     http://www.it315.org/xmlbook.xsd
                  http://www.it315.org/demo/schemahttp://www.it315.org/demo.xsd">                                                
                 <书>                                                                                                                    
                  <书名>JavaScript网页开发</书名>                                                                                 
                  <作者>张孝祥</作者>                                                                                             
                  <售价 demo:币种=”人民币”>28.00元</售价>                                                                       
                 </书>                                                                                                                   
                </书架> 
        19.不使用名称空间引入XML Schema文档 (这不是使用了名称空间吗??)
      
         文件清单:xmlbook.xml                                                                                                                                                              
         <?xml version="1.0" encoding="UTF-8"?>                    
         <书架 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:noNamespaceSchemaLocation="xmlbook.xsd">      
          <书>                                              
           <书名>JavaScript网页开发</书名>           
           <作者>张孝祥</作者>                       
           <售价>28.00元</售价>                      
          </书>                                             
         </书架> 
 20.在XML Schema 文档中声明名称空间
  <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
   targetNamespace="http://www. itcast.cn"
   elementFormDefault="qualified">
  <xs:schema>
  
  targetNamespace 元素用于指定Schema文档中声明的元素是属于那个名称空间的!
  elementFormDefault元素用于指定,Schema中声明的根元素以及其所有子元素都属于 targetNamespace所指定的名称空间!
四、Schema语法:参见 W3C 文档!                                         

 

 

记不清这个是老师写的,还是我自己整理的!当时就是老师在那里讲,我在电脑上敲我的笔记和心得!  代码要是打起来麻烦的话,我就直接拷下来了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值