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文档中的某个节点。

时间: 2024-10-29 10:46:14

XML基础的相关文章

XML基础&lt;第一篇&gt;

一.XML简介 XML是一种标记语言,用于描述数据,它提供一种标准化的方式来来表示文本数据.XML文档以.xml为后缀.需要彻底注意的是XML是区分大小写的. 先从一个简单的XML例子来了解下xml基础: <?xml version="1.0" encoding="utf-8" ?> <books ISBN="9787544238212"> <title>xml学习笔记</title> <pr

FFmpeg深入分析之零-基础 &lt;第一篇&gt;

FFmpeg是相当强大的多媒体编解码框架,在深入分析其源代码之前必须要有基本的多媒体基础知识,否则其源代码会非常晦涩难懂.本文将从介绍一些基本的多媒体只是,主要是为研读ffmpeg源代码做准备,比如一些编解码部分,只有真正了解了多媒体处理的基本流程,研读ffmpeg源代码才能事半功倍. 下面分析一下多媒体中最基本最核心的视频解码过程,平常我们从网上下载一部电影或者一首歌曲,那么相应的多媒体播放器为我们做好了一切工作,我们只用欣赏就ok了.目前几乎所有的主流多媒体播放器都是基于开源多媒体框架ffm

CSS3基础第一篇(圆角,阴影,渐变,选择器)

1.border-radius:1px 2px 3px 2px;  /*添加圆角  四个半径值分别是左上角.右上角.右下角和左下角,顺时针 */ 2.box-shadow:0px 0px 12px 5px #33CC00 inset; /*添加阴影 参数分别是  X轴偏移量 Y轴偏移量  [阴影模糊半径] [阴影扩展半径][阴影颜色]  [投影方式]*/ a.阴影模糊半径与阴影扩展半径的区别 阴影模糊半径:此参数可选,其值只能是为正值,如果其值为0时,表示阴影不具有模糊效果,其值越大阴影的边缘就

Django基础第一篇

目录 1.Django MTV框架简介 2.基础命令创建项目的配置说明 3.前后端交互案例 4.基于数据库实现数据交互增删改查 Django简介 Django框架的设计模式借鉴了MVC的思想,和MVC不同的点是它拆分的三部分,分别为:(Model)模型. (Template)模板.以及(View)视图 MVC和MTV知识点补充: MVC是三个单词的首字母缩写,它们是Model模型.View视图 和Controller控制. 1)最上面的一层,是直接面向最终用户的"视图层"(View).

【SSH三大框架】Hibernate基础第一篇:编写第一个Hibernate程序

接下来这几章节学习的是Hibernate,Hibernate的主要作用就是用来和数据库进行连接,简化了JDBC的操作. 首先,我们创建项目,然后把Hibernate的jar包和sqlserver的驱动导入进去. 接下来,我们须要写一个实体类:User package cn.itcast.hibernate.domain; import java.util.Date; public class User { private int id; //private String name; privat

【SSH三大框架】Spring基础第一篇:搭建Spring环境、实例化Bean、管理Bean的作用域以及Bean的生命周期

一.搭建Spring环境: 在lib目录下引入jar包,然后add to path,这就不过多说了. 二.实例化Bean的三种方式: 首先,我们先写两个java类: 接口类: public interface PersonService { public abstract void save(); } 实现类: public class PersonServiceBean implements PersonService { @Override public void save(){ Syste

黑马程序员--oc基础第一篇

一.oc的基础知识 1.oc的源代码的扩展名为:“.m” 2.不再用include了,改用#import<Foundation/foundation.h>,区别就是import自动检查是否包含了相同的头文件,不需要再在c语言中用IFDef了. 3.类的声明用@interface @end,将声明代码写在两部分之间. 4.BOOL 类型的实质为char typedef signed char BOOL: #define Yes (BOOL) 1 #define No (Bool) 0 5.在oc

【SSH三大框架】Struts2基础第一篇:编写第一个Struts2程序

本年八月份的时候已经是把SSH三层框架学完了,然后又转战Android开发,已经很久没用三大框架做东西了,所以想要花三四天的时间复习一下,就写在博客上. 附带SSH所有jar包网盘下载地址:http://pan.baidu.com/s/1hqf5ta8 首先,我们新创建一个web项目,然后引入jar包:commons-fileupload,commons-io,freemarker,javassist,ognl,struts2-core,xwork-core. 这里只是个简单的struts程序,

JavaSE基础第一篇

1.JDK的安装: 包括JRE 和JVM 下载地址: www.oracle.com/www.sun.com 2.环境变量 set path = "bin所在路径" 设置path环境变量: 方便找到要启动的应用程序 环境变量 path="bin路径" path_home ? 方便对java/bin路径的修改 path(path_home引入path) ;%%JAVA_HOME%/bin; 绿色版与安装版 绿色版:可以其他文件夹,可以正常使用 安装版 3. java的特

webpack基础第一篇(配置文件)

1.安装mode.js.npm本地环境,lue 2.命令语言 mkdir  webpack_demo  //建立文件夹 cd  webpack_demo  //进入文件夹 npm install -g webpack  //全局安装webpack npm init  //初始化 npm install --save-dev webpack //安装目录 3.建立项目基本结构 src文件夹 ----存放编写的源码 dist文件夹 ----存放webpack打包后的文件 dist下建立index.h