1 实体:
用于定义可以替换的字符或数据。可以理解成一个常量。它必须包含在DOCTYP声明中。例如:
<?xml version="1.0" encoding="gbk"?>
<!--开始声明DTD-->
<!DOCTYPE a[ <!--此处名称必须与根元素同名-->
<!ELEMENT a (b)> <!--声明根元素a,包含 子元素b-->
<!ELEMENT b (name,age)> <!--元素b包含两个元素name和age-->
<!ELEMENT name (#PCDATA)> <!--两个元素的类型都是#PCDATA-->
<!ELEMENT age (#PCDATA)>
<!ENTITY ONE "KING"><!--声明实体-->
]>
<a>
<b>
<name>&ONE;</name><!--[引用实体]-->
<age>32</age>
</b>
</a>引用时使用&ONE;就可以替换实体”king”。
2 DTD
用于定义xml文档中标签的格式,以方便在文档传递后根据DTD对文档进行解析。DTD可以写在xml文档中,也可以引用一个文本。例如:
直接在xml中定义DTD
<?xml version="1.0" encoding="GB2312"?>
<!DOCTYPE 家庭成员[
<!ELEMENT 姓名 (#PCDATA)>
<!ENTITY ONE "KING">
]>
其中<!ELEMENT 姓名 (#PCDATA)>定义了姓名标签只能是(#PCDATA)字符格式
引用外部DTD文件
在xml文档同目录下创建一个a.dat文档。
<!ELEMENT a (#PCDATA)>
<!ENTITY ONE "KING">
然后在xml中引用这个文档
<?xml version="1.0" encoding="GB2312"?>
<!DOCTYPE 家庭成员 SYSTEM "a.dtd">
值得注意的是使用外部方式时LEEMENT的标签必须是英文,使用中文会报错。
DTD例子:
<!ELEMENT a (b+)> //说明一个根标签 +表示必须出现一次
<!ELEMENT b (name, age)> //说明一个子标签,同时说明以下的子标签元素
<!ELEMENT age (#PCDATA)> //说明标签元素的类型
<!ELEMENT name (#PCDATA)>
<!ATTLIST a abc CDATA "123"> //说明标签a的属性abc的默认值是123
<!ENTITY one "king"> //说明实体one它的值是king
3 元素类型声明
<!ELEMENT 元素名(元素内容说明)>,
元素内容包含五个
A EMPTY 空元素内容
B ANY 任意元素内容
C 指定元素:元素内只能出现指定的子元素。例如:<!ELEMENT 就业信息(公司名,简介,地址,职位*)>。
在子元素后跟*号说明该子元素可以出现任意多次,+号说明可以出现至少一次,?号说明可以最多一次。 另外子元素出现的顺序必须与声明顺序一致
D 混合内容
4 标签属性。
可以在标签中指定属性,例如:<月薪 货币单位=”人民币”>6000</月薪>
在DTD中属性声明:
<!ELEMENT 月薪 (#PCDATA)>
<!ATTLIST 月薪 货币单位 CDATA ”人民币”>
声明的语法:
<!ATTLIST 对应元素名 属性名 属性类型 “默认值”>
例如:
<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE movies
[
<!ELEMENT movies (movie+)>
<!ELEMENT movie (title,actor+,rating)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT actor (#PCDATA)>
<!ELEMENT rating (#PCDATA)>
<!ATTLIST movie type CDATA "电影"><!--声明元素movie的属性type,默认值是“电影”-->
]
>
<movies>
<movie><!--如果没有显示声明属性值,那么就使用默认属性值-->
<title> 空中监狱 </title>
<actor> 尼古拉斯 凯奇</actor>
<rating>家长指引</rating>
</movie>
<movie type="恐怖片">
<title> 幽灵 </title>
<actor> 黛米 摩尔</actor>
<actor> 帕特里克 斯韦兹</actor>
<rating>家长指引</rating>
</movie>
</movies>
强制使用哪个指定属性:FIXED
<!ATTLIST movie type CDATA #FIXED "电影">
不强制提供属性值IMPLIED
<!ATTLIST movie type CDATA #IMPLIED>
5 命名空间声明
当标签元素中有重名,xml解析器就会出错。这个时候就要用到命名空间。
声明命名空间格式:xmlns:前缀名="url"
例如:
<?xml version="1.0" encoding="gb2312" ?>
<!--在根元素中,声明前缀-->
<sample xmlns:ins="http://www.Aptech_edu.org"
:tea="ddddd">
<ins:batch-list>
<ins:batch>夜间培训批次</ins:batch>
<ins:batch>早间培训批次</ins:batch>
<ins:batch>午间培训批次</ins:batch>
<ins:batch>
第一批茶<tea:batch>批号 333 </tea:batch>
</ins:batch>
<ins:batch>
第二批茶<tea:batch>批号 222 </tea:batch>
</ins:batch>
</ins:batch-list>
</sample>
命名空间前缀不但可以用在标签元素,还可以用在属性上。
例如:
xmlns= "http://www.Aptech_edu.ac"
xmlns:tea= “http://www.tea.org">
<batch-list>
<batch type= “thirdbatch”>第三批次</batch>
<batch tea:type= “thirdbatch”>第三批茶 </batch>
<batch>午班批次</batch>
. . .
第二个batch的type属性有一个前缀tea。所以它与第一个type是不同的两个属性。
通常命名空间声明在根元素当中。前缀后面跟的字符串不一定是个域名,可以是其他的字符串,它只不过是标识而已。
6 css样式表
通过样式表可以指定页面中的标签元素的显示方式。例如:
<!—
h3{color:red;font-style:italic;}
-->
<h3>whlcome to css world!</h3>
在注释中说明了标签h3标签的样式,那么h3标签显示时就会是指定的样式
在xml当中,是将css独立成一个单独的文件。使用时将其导入。
在xml中导入css文件的格式:
<?xml-stylesheet type=”text/css” href=”info.css”?>
Info.css文件:
h3{color:red;font-style:italic;}
这样就可以指定xml当中标签的样式
7 schema
它与DTD一样都是预定义和约束xml文档的。不过schema功能更强大,
Schema是一个*.xsd文件。使用时在xml文档中引入
完整例程:
schema文件:
<?xml version="1.0" encoding="gb2312"?>
<!--schema的根元素,elementFormDefaul:元素是否受控,attributeFormDefault:属性是否受控-->
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xsd:element name="class"> <!--定义根元素-->
<xsd:complexType><!--用于包括class元素的子元素-->
<xsd:sequence>
<xsd:element name="student" maxOccurs="unbounded"><!--用于包括student元素的子元素和属性-->
<xsd:complexType>
<xsd:sequence><!--说明包含的子元素必须按顺序出现-->
<xsd:element name="age"/><!--student的子元素-->
</xsd:sequence>
<xsd:attribute name="studentId" type="xsd:int"/><!--student的属性-->
<xsd:attribute name="name" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:unique name="StudentIdUnique">
<!--说明唯一约束-->
<xsd:selector xpath=".//student"/>
<!--路径student标签下的-->
<xsd:field xpath="@studentId"/>
<!--@studentId属性必须唯一-->
</xsd:unique>
</xsd:element>
</xsd:schema>
Xml文件:
<?xml version="1.0" encoding="gb2312"?>
<class xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="class.xsd">
<student studentId="1" name="李华">
<age>32</age>
</student>
<student studentId="2" name="张建">
<age>32</age>
</student>
<student studentId="3" name="王淘">
<age>32</age>
</student>
<student studentId="4" name="马明语">
<age>32</age>
</student>
</class>
一 element元素:
标签元素,该元素定义标签,有以下几个属性
Name:名称属性
Type: 类型属性
Ref: 表示该元素属于上级元素的子元素。
Fixed:表示该元素的值是不能改变的。
Default:默认值
minOccurs="2" maxOccurs="unbounded": 最大值和最小值
注意:只有minOccurs和maxOccurs是在声明子元素时使用。其他的是在说明具体说明元素中使用,例如:
<xs:element name="st">
<xs:complexType>
<xs:sequence>
<xs:element ref="Id" minOccurs="2" maxOccurs="unbounded" />
<xs:element ref="Name"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Id" fixed="3" type="xs:int"/>
<xs:element name="Name" type="xs:string"/>
二 attribute元素
该元素用于说明标签的属性,它必须包含在complextype标签之中,并且必须在子元素之后。例如:
<xs:element name="st">
<xs:complexType>
<xs:sequence>
<xs:element ref="Id"/>
<xs:element ref="Name"/>
</xs:sequence>
<xs:attribute name="time" type="xs:string" default="3"/>
</xs:complexType>
</xs:element>
注意:它不能用于说明末级标签。
三 complextype元素
用于包含标签的子标签和属性。如果一个标签元素不是末级标签,那么它的子标签和属性必须包含在complextype之中。
四 restriction元素
限定取值范围,它必须包含在simpletype标签中。例如:
<xs:element name="Id">
<xs:simpleType>
<xs:restriction base="xs:int">
<xs:minInclusive value="3"/>
<xs:maxInclusive value="6"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
五 unique元素
该元素说明元素值和属性的唯一性约束。例如:
<xs:element name="class">
<xs:complexType>
<xs:sequence>
<xs:element ref="st" minOccurs="1" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:unique name="stUniqe">
<xs:selector xpath=".//st"/>
<xs:field xpath="@time"/>
</xs:unique>
<xs:unique name="stUniqe1">
<xs:selector xpath=".//st"/>
<xs:field xpath="Id"/>
</xs:unique>
</xs:element>
stUniqe标签约束了st标签的time元素必须是唯一的。stUniqe1标签约束了st子元素Id必须唯一。注意,该标签必须与需要约束的标签同级。
六 sequence元素
该元素说明包含的子元素必须按顺序出现。
8 文档模型对象DOM
1 DOM定义了应用程序如何存取xml文档
2 DOM以节点的方式操作,节点可以是元素、属性、文本。DOM遍历整个xml文档,当遇到节点就会创建一个节点对象。并按父子关系创建节点树。
3 XML DOMDocument对象:xml文档的根,DOM的第一个节点对象。
4 XML DOMNode对象:节点对象。其他的节点例如元素、属性、文本(domattrbut domelement domtext)都是继承它。
5 XML DOMNodelist对象:节点集合对象
6 XML DOMElement对象:元素对象
7 XML DOMAttribute对象:属性对象
8 XML DOMText对象:元素或属性的文本内容
通过DOM取xml文档的顺序
A 声明DOM解析器
B 给解析器定位xml文档地址
C 声明document对象,
D 用document对象取所有元素节点赋值给节点集合对象。
E 遍历节点集合,并逐个取出元素节点。用元素对象接收
F 判读元素是含有属性,如果有,使用属性集合对象接收所有属性,并遍历。
G 用属性节点对象接收。
例程:
//用缓存读取argv
BufferedReader in = new BufferedReader(new FileReader("student.xml"));
DOMParser parser = new DOMParser();//实例化DOM解析器
parser.parse(new InputSource(in));//解析器定位xml文档
Document doc = parser.getDocument();//声明文档对象,并用解析器创建一个实例
NodeList nl = doc.getElementsByTagName("*");//声明一个节点集合,并取所有元素赋值给它
Element e;//声明一个元素对象
Attr attr;//声明一个属性对象
NamedNodeMap nnm;//通过名称访问节点的集合,用于接收元素属性的集合
String attrname;//属性名
String attrval;
int i,len;
len = nl.getLength();
//遍历所有节点
for (int j=0;j < len;j++)
{
e = (Element)nl.item(j);//从节点集合中取一个元素节点,并做类型强制转换为元素
//getTagName()方法取元素节点名:取元素节点值
System.out.println(e.getTagName()+":"+e.getFirstChild().getNodeValue());
nnm = e.getAttributes();//取元素节点属性值
if (nnm != null)//当元素节点有属性时
{
for (i=0;i<nnm.getLength();i++)
{
attr = (Attr)nnm.item(i);
attrname = attr.getName();
attrval = attr.getValue();
System.out.println(" 属性是:"+attrname+" = "+attrval);
}
}
9 有时候我们需要在程序中效验xml的有效性,使用如下代码:
DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();
dbfactory.setNamespaceAware(true);
dbfactory.setValidating(true);
DocumentBuilder domparser = dbfactory.newDocumentBuilder();
Document doc = domparser.parse(new File("student.xml"));
System.out.println("XML文档解析完毕!");
9 XSL样式表
Xsl与css功能相似,定义啦xml的输出样式
1 xml模板
定义了xsl处理xml元素按那个层级循环处理
例如:
<xsl:template match="item-info">
标签template 属性match指定了按item-info标签来循环处理输出
<xsl:value-of select="quantity"/>
标签:value-of输出元素标签,select属性指定输出的元素标签
模板中可以引入另一个模板,
使用标签<xsl:apply-templates select="item-info"/>
例如:
<xsl:template match="order">
<HTML>
<HEAD>
<TITLE>
</TITLE>
</HEAD>
<BODY>
<H1>XSL 模板</H1>
<xsl:apply-templates select="item-info"/>
</BODY>
</HTML>
</xsl:template>
这里引入了另一个模板item-info
<xsl:template match="item-info">
<BR/>
<DIV>
<I>
<xsl:value-of select="quantity"/>
</I>
</DIV>
<DIV>
<I>
<xsl:value-of select="item-name"/>
</I>
</DIV>
</xsl:template>
我们可以注意到,xsl模板中实际上包含了完整的html代码。显示也是按这些html的格式输出的。它的主要作用就是按设定样式迭代输出xml数据。
2 XSLT元素
通过xslt元素可以实现编程功能,它包含了选择、循环、等方法。
例如:
<xsl:template match="orderdetails">//使用根元素做模板
<HTML>
<HEAD>
<TITLE> 使用 XSLT</TITLE>
</HEAD>
<BODY>
<xsl:for-each select="order">//迭代输出order标签元素
<H2>
<xsl:text>订单号:</xsl:text>//text元素用于插入文本
<xsl:value-of select="number"/>//输出订单号标签
</H2>
<xsl:for-each select="item-info">//迭代输出商品信息,这里是一个嵌套循环
<xsl:variable name="x" select="price"/>//声明一个变量x
<H3>
<xsl:value-of select="position()"/>//引用一个方法,递增显示数组
<xsl:text>. </xsl:text>
<xsl:value-of select="item-name"/>
</H3>
<H4>
<xsl:text>该商品的价格为:</xsl:text>
<xsl:value-of select="$x"/>//引用变量x,注意要家$号
</H4>
</xsl:for-each>
</xsl:for-each>
</BODY>
</HTML>
</xsl:template>
10 数据源对象DOS
DOS是IE浏览器的一个控件。通过该控件可以在html代码中嵌入xml文档或xsl样式表。
这样我们就可以设计好html的版面,然后将xml的数据引入。
数据岛:在html页面上引用的xml文档。
1 内联数据岛:直接在html中插入xml代码。例如:
<html>
<body>
<xml id="sdb">
<?xml version= "1.0"?>
<database>
<school-info>
<name>Riverdale 高中</name>
<city>纽约</city>
<students>550</students>
</school-info>
<school-info>
<name> Dream Valley 高中 </name>
<city>布法罗</city>
<students>650</students>
</school-info>
<school-info>
<name>Sutherland 私立学校 </name>
<city>波士顿</city>
<students> 625 </students>
</school-info>
</database>
</xml>
</body>
</html>
该代码不会在页面中显示,但页面中可以通过它的id号sdb来引用它。
2 外部引用xml
不直接在html代码中输入xml,而是引用一个外部的xml文件。例如:
<xml id= "schools" src= "example 1.xml"> </xml>
然后就可以在JavaScript中引用这个id
<script language = "JavaScript">
function load()
{
var xmlDso = schools.XMLDocument;
var xslDso = Stylesheet.XMLDocument;
divResults.innerHTML = xmlDso.transformNode(xslDso);
}
</script>
3 绑定xml数据岛到html
有两个关键属性
a: datasrc指定引用xml的id
b:datafld 映射html与xml节点关联,已在该html标签处显示xml标签的内容。
例如:
<body>
<xml id= "schools" src= "example 1.xml"> </xml>
<table datasrc = "#schools" id = "school info"
width= "80%" align="center" cellpadding= "0"
cellspacing = "0" border= "1">
<thead>
<th>学校名称</th>
<th>城市</th>
<th>学生人数</th>
</thead>
<tr>
<td valign = "top"><div datafld =
"name"></div></td>
<td valign = "top"><div datafld =
"city"></div></td>
<td valign = "top"><div datafld =
"students"></div></td>
</tr>
</table>
</body>
注意:datasrc指定的id要加前缀#
4 recordset对象
该对象用于存储xml文档,利用该对象可逐条访问xml记录。
该对象可在javascript语言中使用,使用该对象时需要在加xml的id前缀
例如:
<xml id= "schools" src= "example 1.xml"> </xml>
<script language ="Javascript">
function firstrec()
{
schools.recordset.moveFirst()
}
</script>
这里定义了一个函数,该函数引用了一个recordset对象,并调用方法movefirst()将游标移动到xml的第一条记录
5 在html中同时写入xml和xsl样式表
例如:
<html>
<head>
<title> DSO 示例 </title>
<script language = "JavaScript">
load()
{
xmlDso = sdb.XMLDocument;//创建xml的dos对象
xslDso = Stylesheet.XMLDocument;//创建xsl样式表的dos对象
divResults.innerHTML = xmlDso.transformNode(xslDso);//在xml对象中指定使用xsl样式表,并显示
}
</script>
</head>
<body bgcolor= "#FFFFF">
//写入xml文档
<xml id="sdb">
<?xml version= "1.0"?>
<database>
......
</database>
</xml>
//写入xsl样式表
<XML id="Stylesheet">
<xsl:stylesheet
:xsl="http://www.w3.org/1999/XSL/Transform"
="1.0">
<xsl:template match="/database">
......
</XML>
<DIV ID="divResults"/>
<input type="BUTTON" value="请单击这里" onCLick="load()">//调用load方法
<br>
<hr>
</body>
</html>