[原创]XML Basic
XML Basic
1. XML was designed to describe, store, carry, and exchange data and to focus on what data is.
XML是用来描述数据的,他不关心Display。相反HTML则关心Display,这是他们同为Markup Language却不同的地方
就像数据库本身也只是一种描述数据的结构形式,需要一些前端支持才能显示出来,最简单的例子就是PB(中国人最喜欢的数据库前端开发软件)。
XML 使用 Document Type Definition (DTD) 或XML Schema 来描述数据,现在DTD用的比较少,大部分情况我们使用Schema, 因为Schema本身也是XML而DTD不是XML结构的。
此外XML也用于存储数据和交换数据。XML可以作为数据库的核心来存储数据。基于XML的各种协议体现了XML的交换能力(如SOAP, WAP)。
最后,XML是平台无关的——现在很流行跨平台,不是么J
好了废话少说我们继续…
2. XML tags are not predefined. You must define your own tags
让我们来看一段简单的XML:
<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>Standing</to>
<from>Jing</from>
<heading>My birthday!!!</heading>
<body>Don't forget my birthday or…</body>
</note>
如果大家接触过HTML/XHTML那么如果要显示这些东西可能要这样写:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>Letter</title>
</head>
<body>
<table width="300" border="0" cellspacing="0" cellpadding="0">
<tr>
<td>From</td>
<td>Standing</td>
</tr>
<tr>
<td>To</td>
<td>Jing</td>
</tr>
<tr>
<td>Heading</td>
<td>My Birthday!!! </td>
</tr>
<tr>
<td>Body</td>
<td>Don't forget my birthday or…</td>
</tr>
</table>
</body>
</html>
好像有些乱J
虽然这种对比有些不恰当——之前我们说过XML和HTML各司其职——但是由于他们的形似还是值得对比一下。
首先他们都是Markup Language 所以形式上大同小异;再看标签的名字,XML很随意,而HTML必须按照<html><body>…这样的规定来写,在HTML文档里出现了<from><to>这样的非预定义元素是没有意义的,这样我们就看出了XML的灵活性,而且在某种意义上来说HTML可以看作是XML的一个应用。总之,XML文档是可以由用户自己随意定义的,只要符合XML的格式规定就可以。“随意”也就注定了他的强大,就像太极拳一样J
3. XML Syntax
XML文档的格式规定是非常严格的。让我们来看段XML:
第一行是XML文档声明(declaration)它说明了XML文档的版本和字符的编码
第二行指明XML的样式表(具体会在后续介绍)
第三行指名了DTD文件(具体会在以后介绍)
第四行是注释
第四行之后才是XML的正式内容。XML文档其实就是一些闭合的“标签”,标签内部可以有属性,大概是这样的一个形式:
<element attr=”I am an attribute”>I am a text node</element>
另外还有些特殊的——CData
<script>
<![CDATA[
function matchwo(a,b)
{
if (a < b && a < 0) then
{
return 1
}
else
{
return 0
}
}
]]>
</script>
CData出现的原因就在于一些特殊字符的存在。在XML里有一些特殊的字符:
转义字符 |
特殊字符 |
|
< |
< |
less than |
> |
> |
greater than |
& |
& |
ampersand |
' |
' |
apostrophe |
" |
" |
quotation mark |
如果想表示这些特殊字符必须转义。而用CDATA就可以避免使用转义字符J
以下是关于XML语法的一些注意事项:
Xml element 命名规则:
· 可以由数字,字母,和一些其他字符组成;
· 不能由数字和标点符号起始;
· 不能由(XML,Xml…)起始;
· 不能有空格。
"Well Formed"和"Valid":
所谓“well formed”指的是一个XML文档符合W3C对XML文档的定义,也就是“是一个XML文档”
而“Valid”指的是这个文档是否满足我们自己定义的规则,这些规则由DTD或者XML Schema来定义,也就是“是一个符合要求的XML文档”。
XML是错误敏感的:
错误敏感也就是说,如果你的程序是基于XML的,那么当XML文档不是“Well Formed”或者不是“Valid”的时候你的应用程序必须中断去处理XML的错误。这种特性是由XML的严格性(strict)决定的,与HTML形成鲜明的对比——一个浏览器可以忽略大量的HTML错误而正常显示页面。
XML文档大小写敏感:
这个不用多说,Standing和standing是不同的。
XML文档必须有一个根节点(看好了,一个哦)
XML文档的属性值必须用引号引起来(单双都可以)
在XML文档里空白符是受保护的(别指望多敲几个空格人家不知道,嘿嘿)
…
4. Name Conflicts
命名冲突怎么解决?
两种方法:一是用前缀;二是用Namespace,看下面两段XML:
<cup>
<contain>Warter</ contain>
<shape>Round</ shape>
</cup>
<cup>
<name>World Cup</ contain>
<gainer>China</ gainer>
<!—Is that a dream? -->
</cup>
这两个cup一个是水杯,一个是奖杯,那么怎么来区分呢?
方法一:
<s:cup>
< s:contain>Warter</ s:contain>
< s:shape>Round</ s:shape>
</ s:cup>
<j:cup>
< j:name>World Cup</ j:contain>
< j:gainer>China</ j:gainer>
<!—Is that a dream? -->
</ j:cup>
我们给两个cup加上前缀,很显然,区分开了。
方法二:
<s:cup xmlns:s="http://www.w3.org/realcup” >
< s:contain>Warter</ s:contain>
< s:shape>Round</ s:shape>
</ s:cup>
<j:cup xmlns:s="http://www.w3.org/pot” >
< j:name>World Cup</ j:contain>
< j:gainer>China</ j:gainer>
<!—Is that a dream? -->
</ j:cup>
这个我们给不同的前缀指定了namespace。现在我们的前缀有了具体的意义。
方法三:
<cup xmlns="http://www.w3.org/realcup” >
< contain>Warter</ contain>
< shape>Round</ shape>
</ cup>
<cup xmlns="http://www.w3.org/pot” >
< name>World Cup</ contain>
< gainer>China</ gainer>
<!—Is that a dream? -->
</ cup>
这个我们利用了默认的namespace。这样我们就可以省去前缀。
XML Programming
1. Data Island
这个东西我觉得挺有趣的J
给个例子:
<html>
<body>
<xml id="cdcat" src="cd_catalog.xml"></xml>
<table border="1" datasrc="#cdcat">
<tr>
<td><span datafld="ARTIST"></span></td>
<td><span datafld="TITLE"></span></td>
</tr>
</table>
</body>
</html>
cd_catalog.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Edited with XML Spy v2006 (http://www.altova.com) -->
<CATALOG>
<CD>
<TITLE>Empire Burlesque</TITLE>
<ARTIST>Bob Dylan</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Columbia</COMPANY>
<PRICE>10.90</PRICE>
<YEAR>1985</YEAR>
</CD>
<CD>
<TITLE>Hide your heart</TITLE>
<ARTIST>Bonnie Tyler</ARTIST>
<COUNTRY>UK</COUNTRY>
<COMPANY>CBS Records</COMPANY>
<PRICE>9.90</PRICE>
<YEAR>1988</YEAR>
</CD>
</CATALOG>
这个例子来自www.w3schools.com, 大家可以在这里看到效果。
这个只有IE支持,所以应用可能不广泛。
2. XML HTTP Request
这个大家一定都如雷贯耳了吧,这项技术可造就了我们每天几乎必去的Google。他也是流行的Ajax的核心技术组成。
这里我们只举个小例子:
<html>
<head>
<script type="text/javascript">
var xmlhttp
function loadXMLDoc(url)
{
xmlhttp=null
// code for Mozilla, etc.
if (window.XMLHttpRequest)
{
xmlhttp=new XMLHttpRequest()
}
// code for IE
else if (window.ActiveXObject)
{
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP")
}
if (xmlhttp!=null)
{
xmlhttp.onreadystatechange=state_Change
xmlhttp.open("GET",url,true)
xmlhttp.send(null)
}
else
{
alert("Your browser does not support XMLHTTP.")
}
}
function state_Change()
{
// if xmlhttp shows "loaded"
if (xmlhttp.readyState==4)
{
// if "OK"
if (xmlhttp.status==200)
{
alert("XML data OK")
document.getElementById('A1').innerHTML=xmlhttp.status
document.getElementById('A2').innerHTML=xmlhttp.statusText
document.getElementById('A3').innerHTML=xmlhttp.responseText
}
else
{
alert("Problem retrieving XML data:" + xmlhttp.statusText)
}
}
}
</script>
</head>
<body onload="loadXMLDoc('note.xml')">
<h2>Using the HttpRequest Object</h2>
<p><b>status:</b>
<span id="A1"></span>
</p>
<p><b>status text:</b>
<span id="A2"></span>
</p>
<p><b>response:</b>
<br><span id="A3"></span>
</p>
</body>
</html>
这里值得一提的就是xmlhttp.open("GET",url,true) 这个方法,第三个参数是true代表异步,也就是send方法不会阻塞script的执行。
其他的例子和一些参考请参阅这里。