首页 > 代码库 > XML基础

XML基础

一、Xml历史

(1)gml(通用标记语言,1969)->sgml(标准通用标记语言,1985)->html(超文本标记语言,1993)->xml,extensible markup language (可扩展标记语言,1998)
二、Xml常见应用
(1)解决程序间数据传输
(2)可以做配置文件
(3)充当小型的数据库
三、Xml语法
(1)文档声明:<?xml version="1.0" encoding="gb2312" standalone="yes" ?>
          要点:xml声明放在xml文档的第一行
                  xml声明由以下几个部分组成:
  • version--文档符合XML1.0规范;
  • encoding--文档字符编码;
  • standalone--文档定义是否独立使用;默认为standalone=“no”。
(2)元素:
  • XML元素指XML文件中出现的标签,一个标签分为开始标签和结束标签,标签分为包含标签体(<a>www.sohu.cn</a>)和不含标签体(简写为<a/>)的形式。
  • 一个标签中也可以嵌套若干子标签。但所有标签必须合理的嵌套,绝对不允许交叉嵌套。      
  • 每个XML文档必须有且只有一个根元素,根元素是一个完全包括文档中其他所有元素的元素。
  • 对于XML标签中出现的所有空格和换行,XML解析程序都会当做标签内容进行处理。
  • 命名规范:一个XML元素可以包含字母、数字以及其他一些可见字符。
  • 区分大小写,例如,<p>和</p>是两个不同的标记;
  • 不能以数字或“_”(下划线)开头;
  • 不能包含空格;
  • 名称中间不能包含冒号“:”;
(3)属性
  • 属性值用双引号(")或单引号(‘)分隔(如果属性值中有 ‘,用 " 分隔;有 " ,用 ‘ 分隔;如果既有 ‘ 又有 " ,则需要使用字符实体);
  • 一个元素可以有多个属性,它的基本格式为:<元素名 属性名="属性值">;
  • 特定的属性名称在同一个元素标记中只能出现一次;
  • 属性值不能包括<,>,&。
(4)注释:<!--这是一个注释-->
  • 注释内容中不要出现--;
  • 不要把注释放在标签中,可以放在除标签以外的任何地方;
  • 注释不能嵌套;
  • XML声明之前不能有注释。
(5)CDATA节:用于把整段文本解释为纯字符数据而不是标签的情况,CDATA节中的所有字符都会被当做元素字符数据的常量部分,而不是XML标签。
          语法:<![CDATA[。。。。内部字符数据部分。。。。]]>
          要点:内部字符数据部分中可以输入任意字符(除]]>外);不能嵌套。CDATA节可用于传递小型图片。
(6)处理指令:processing instruction,简称PI
          要点:处理指令必须以“<?”作为开头,以“?>”作为结尾,XML声明语句就是最常见的一种处理指令。
四、XML文件约束—dtd
(1)xml文件常用的约束有dtd、schema
(2)dtd(document type definition 文档类型定义)文件一般和xml文件配合使用来约束xml的书写规范。
(3)dtd文档的定义语句、声明及引用:
    DTD语法:
               元素定义:
    <!ELEMENT NAME(节点名) CONTENT>
     其中CONTENT取值可以为:
    EMPTY:该元素不能包含子元素和文本,但可以有属性(空元素)
    ANY:该元素可以包含任何在DTD中定义的元素内容,一般为当前节点名下面所包含的节点名列表
    #PCDATA:可以包含任何字符数据,但是不能在其中包含任何子元素其他类型(组合)
修饰符:
 
技术分享   
    eg:
    <!ELEMENT 班级 (学生+)>
    <!ELEMENT 学生 (名字,年龄,介绍)>
    <!ELEMENT 名字 (#PCDATA)>
    <!ELEMENT 年龄 (#PCDATA)>
    <!ELEMENT 介绍 (#PCDATA)>
    其中#PCDATA表示该节点名内可放任何文本
  属性定义语法:
    <!ATTLIST 元素名称 
         属性名称 类型 属性特点
         属性名称 类型 属性特点......
    >
    
    类型的可取值:
  • CDATA     表示属性值可以是任何字符(包括数字和中文)
  • ID     表示该属性的取值必须唯一,且不能以数字开头
  • IDREF/IDREFS     表示该属性的值指向文档中其它地方声明的ID属性的值,IDREFS表示可有指向多个ID属性的值,用空格进行分隔。
  • Enumerated     表示属性的值必须是事先所列出的值的范围内。 
      eg:<!ATTLIST person 婚姻状况 (single|married|divorced|widowed) #IMPLIED>
  • ENTITY/ENTITIES:实体,用于为一段内容创建一个别名,以后在XML文档中就可以使用别名来引用这段内容了。
        可分为两种类型:引用实体和参数实体
             引用实体:
  • 主要用在XML文档中
  • 语法格式(dtd中最后定义):
    <!ENTITY 实体名称 "实体内容">:在被引用的时候直接转化为实体内容
  • 引用方式(xml中引用):&实体名称;
  • 使用例子:
    <!ENTITY copyright "I am a programmer">
    ...
    ©right;

          参数实体:

  • 被DTD文件自身使用
  • 语法格式:
    <!ENTITY % 实体名称 "实体内容">
  • 引用方式
    %实体名称;
  • 使用例子:
    <!------------------第一个例子------------------->
    <!ENTITY % TAG_NAMES "姓名|EMAIL|电话|地址">...<!ELEMENT 个人信息 (%TAG_NAMES;|生日)><!ELEMENT 客户信息 (%TAG_NAMES;|公司名)><!---------------第二个例子------------------><!ENTITY % common.attributes     "id ID #IMPLIED     account CDATA #REQUIRED">...<!ATTLIST purchaseOrder %common.attributes;><!ATTLIST item %common.attributes;>

    属性特点的可取值: 

  • #REQUIRED     表示必须有该属性值
  • #IMPLIED     表示可有可无
  • #FIXED value     表示可以没有,但如果有则属性值必须是固定值value     eg:<!ATTLIST 姓名 地址 #CDATA #FIXED "北京">
  • Default value 表示如果不指定,则默认值为value

  声明:

  • 内部DTD文档  
    <!DOCTYPE 根元素 [dtd定义内容]>
  • 外部DTD文档  
    <!DOCTYPE 根元素 SYSTEM "DTD文件路径">
  • 内外部DTD文档结合  
    <!DOCTYPE 根元素 SYSTEM "DTD文件路径" [内部dtd定义内容]>
  引用:xml文件使用DOCTYPE声明语句来指明它所遵循的DTD文件
  • 当引用的DTD文件在本地时,采用:  
    <!DOCTYPE 文档根节点 SYSTEM "DTD文件的本地路径">
  • 当引用的DTD文件是一个公共的文件时,采用:  
    <!DOCTYPE 文档根节点 PUBLIC "DTD名称" "DTD文件的URL">
(4)编程校验XML文档正确性javascript代码)
      • 创建xml文档解析器对象  
        var xmldoc=new ActiveXObject("Microsoft.XMLDOM");
      • 开启xml校验  
        xmldoc.validateOnParse="true";
      • 装载xml文档  
        xmldoc.load("book.xml");
      • 获取错误信息(一般用document.writeln(xmldoc.parseError.reason);打印出来)  
        xmldoc.parseError.reason;
        xmldoc.parseError.line;
五、编码问题
ansi:American national standard institute 美国国家标准协会
ansi编码一般为操作系统默认编码,不同国家不一样,可能是gb2312、gbk、big5等,xml文件保存编码格式和文档声明中encoding的编码格式要一致!!!
六、XML编程
1、xml解析技术介绍
     分为:dom解析(W3C推出的标准)和sax解析
     DOM解析与SAX解析的优缺点:
  • 使用DOM解析XML文档时,需要读取整个XML文档,在内存中构建代表整个DOM树的Document对象,从而再对XML文档进行操作。如果XML文档特别大,就会消耗计算机的大量内存,严重的情况下甚至还可能导致内存溢出。
  • SAX解析允许在读取文档的时候,即对文档进行处理,不必等到整个文档装载完才对文档进行处理。
  解析器:Crimson(sun)、Xerces(ibm捐给apache社区)、Aelfred2(dom4j)
  解析API:Jaxp(sun)[dom]、dom4j[dom](性能最好)
2、JAXP介绍
     (1)JAXP开发包是J2SE的一部分,它由javax.xml、org.w3c.dom、org.xml.sax包及其子包组成。
     (2)获得DOM解析器的步骤:
  • 调用DocumentBuilderFactory.newInstance()方法得到创建DOM解析器的工厂;
  • 调用工厂对象的newDocumentBuilder方法得到DOM解析器对象;
  • 调用DOM解析器对象的parse()方法解析XML文档,得到代表整个文档的Document对象,进行可以利用DOM特性对整个XML文档进行操作了。
3、SAX
     (1)sax主要用于对xml文件解析(读取数据),不能去修改、删除、添加元素及属性;
     (2)sax技术是一种推的机制,发现内容自动调用相应的监听函数,具体如何处理由程序员自己决定。
4、DOM4j解析技术(效率高,同时可以进行crud操作)
     (1)开发dom4j需要引入相应的jar包
     (2)获得Document对象:
  • 读取XML文件,获得Document对象  
         SAXReader reader=new SAXReader();  
         Document document=reader.read(new File("文件路径"));
  • 解析XML形式的文本,得到document对象
         String text="<members></members>";
         Document documet=DocumentHelper.parseText(text);
     
  • 主动创建document对象
         Document document=DocumentHelper.createDocument();
         //创建根节点     
         Element root=document.addElement("members");
  (3)获得节点对象
  • 获得文档的根节点:  
         Element root=document.getRootElement();
  • 取得某个节点的子节点  
         Element element=node.element("节点名字");
  • 取得节点的文字
         String text=node.getText();
5、xpath
  往往是结合dom4j使用,使用xpath时需要引入jaxen-1.1-beta-6.jar这个jar包;可以方便的访问到xml文档中的某个节点。

XML基础