前言
在很久以前,笔者曾见到过1000+页的xml书,里面还有n多的概念,XSL,Xquery,让人头痛。无奈最近需要用到,所以在w3c恶补了一下。以下大致整理了一下相关概念,但是对XSL等派生语言没有详细的展开。
XML简介
XML 指可扩展标记语言
XML 被设计用来传输和存储数据
XML 与 HTML 的主要差异
XML 不是 HTML 的替代
XML 和 HTML 为不同的目的而设计:
XML 被设计为传输和存储数据,其焦点是数据的内容。
HTML 被设计用来显示数据,其焦点是数据的外观。
什么是 XML?
XML 指可扩展标记语言(EXtensible Markup Language)
XML 是一种标记语言,很类似 HTML
XML 的设计宗旨是传输数据,而非显示数据
XML 标签没有被预定义。您需要自行定义标签。
XML 被设计为具有自我描述性(简单地说就是XML以树形结构展开,通过元素、子元素和属性描述,让人一看就懂)。
XML 是 W3C 的推荐标准
我觉得初学者可能会走近的误区:
1. XML是不是HTML的取代者
不是。写得好的html应该是一个well-formed的xml文档,其他方面最好不要把他们放在一个水平线上比较
2. XML是不是数据库的取代者
不是。
3. XML是不是...的取代者
都不是。
这个结论可能听上去很滑稽:XML是非常非常重要的东西,但它什么都取代不了。
但这并不奇怪,有人把它比做ASCII标准,他们是一切一切的基础,但并没有(也不需要)取代什么。(但是就如同ASCII取代了一些没有成大器的字符集定义,
XML也会取代你在应用中自己定义的一些数据传输规范,但没有什么特别主流的东西。)
刚开始学XML(或者说没开始学之前)的时候最爱问的一个问题肯定是:使用XML能给我带来什么好处?
我觉得从某种角度上说,使用XML有些象使用OO面向对象:
-你可以用它,你也可以不用它。
-如果你的应用非常简单,用它不一定方便,没准儿用了效果还会更差。
-和其他实际东西比如数据库,MTS,Web Server比起来,它更像是一个概念,一种方法
-项目越大,它的发挥余地越大,作用越大。
-一旦真正理解后,哪怕不用xml parser,也不妨碍你使用这个概念,如同可以抛开特定语言使用OO。
- ......
XML的作用
作为一种通用的数据表示方法,用于数据的传输和存储
xml有全套的操作这种结构的方法
XSD,XSL,解析器,Xquery:数据查询(及语句)
定义派生标签语言:怎么定义,给出检验方法吗?另外就是怎么学习xml的派生语言。
XML语法:
实例:
<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
所有 XML 元素都须有关闭标签
XML 标签对大小写敏感
XML 文档必须有根元素
XML 的属性值须加引号
层级结构:数据的种类可以参考json,无非是数组和对象,同样可以用编译原理中的递归定义来定义xml。在xml中,用标签名相同的兄弟元素表示数组,用标签名不同的兄弟元素表示对象的成员,从而表示了对象。
Xml元素的标签名表示对象的类型(描述这个对象是什么)
XML 元素 vs. 属性
<person sex="female">
<firstname>Anna</firstname>
<lastname>Smith</lastname>
</person>
<person>
<sex>female</sex>
<firstname>Anna</firstname>
<lastname>Smith</lastname>
</person>
没有什么规矩可以告诉我们什么时候该使用属性,而什么时候该使用子元素。我的经验是在 HTML 中,属性用起来很便利,但是在 XML 中,您应该尽量避免使用属性。如果信息感觉起来很像数据,那么请使用子元素吧。
因使用属性而引起的一些问题:
属性无法包含多重的值(元素可以)
属性无法描述树结构(元素可以)
属性不易扩展(为未来的变化)
属性难以阅读和维护
元数据(有关数据的数据)应当存储为属性,而数据本身应当存储为元素。
常用属性:id,name,xmlns
--------------------------------------------xml“高级”语法------------------------------------------------------
命名空间:它的作用是防止命名冲突,可想而知,在日常的数据表示中用得不多。但在一些通用的语言定义中会用到,如xsl。
<h:table xmlns:h="http://www.w3.org/TR/html4/">
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>
在某个标签块中用属性xmlns声明命名空间,如<h:table xmlns:h="http://www.w3.org/TR/html4/">,则在整个块中都可以使用该命名空间。声明的内容是指向一个描述该命名空间的URL。
CDATA:在一个块内,用<![CDATA[ ……]]>把内容包住,使在该块中可以不用xml实体。可见这个东西不太常用,主要在定义的语言中可能用到。
<script>
<![CDATA[
function matchwo(a,b)
{
if (a < b && a < 0) then
{
return 1;
}
else
{
return 0;
}
}
]]>
</script>
XML 声明:如<?xml version="1.0" encoding="ISO-8859-1"?>,它不满足xml语法,不属于xml的部分。
编码属性(encoding)应当被指定为文档被保存时所使用的编码。我最好的避免错误的建议是:
使用支持编码的编辑器
确定编辑器使用的编码
在您的 XML 文档中使用相同的编码属性
Xml验证
合法的 XML 文档是“形式良好”(符合一般的xml语法规则)的 XML 文档,同样遵守文档类型定义 (DTD) 的语法规则:
***Note.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE note SYSTEM "Note.dtd">
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
***Note.dtd
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
W3C 支持一种DTD代替者,它名为XML Schema,它的语法基于XML
<xs:element name="note">
<xs:complexType>
<xs:sequence>
<xs:element name="to" type="xs:string"/>
<xs:element name="from" type="xs:string"/>
<xs:element name="heading" type="xs:string"/>
<xs:element name="body" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
查看xml
Xml也能在浏览器中显示(放在链接里),可见这个主题并不常用。
但是显示方案有一定的浏览器差异性,当xml有语法错误时,浏览器还会报错
解决方案1:用css定制样式
***cd.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/css" href="cd_catalog.css"?>
<CATALOG>
<CD>
<TITLE>Empire Burlesque</TITLE>
<ARTIST>Bob Dylan</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Columbia</COMPANY>
<PRICE>10.90</PRICE>
<YEAR>1985</YEAR>
</CD>
</CATALOG>
***cd_catalog.css
CATALOG
{
background-color: #ffffff;
width: 100%;
}
CD
{
display: block;
margin-bottom: 30pt;
margin-left: 0;
}
TITLE
{
color: #FF0000;
font-size: 20pt;
}
ARTIST
{
color: #0000FF;
font-size: 20pt;
}
COUNTRY,PRICE,YEAR,COMPANY
{
display: block;
color: #000000;
margin-left: 20pt;
}
很容易看懂,本来就有自定义的html标签
CSS 格式化 XML 不是常用的方法,更不能代表 XML 文档样式化的未来。W3C 推荐使用 XSLT。
解决方案2:XSLT, 是首选的 XML 样式表语言。
***breakfast.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="simple.xsl"?>
<breakfast_menu>
<food>
<name>Belgian Waffles</name>
<price>$5.95</price>
<description>
two of our famous Belgian Waffles
</description>
<calories>650</calories>
</food>
</breakfast_menu>
***simple.xsl
<?xml version="1.0" encoding="ISO-8859-1"?>
<!-- Edited with XML Spy v2007 (http://www.altova.com) -->
<html xsl:version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml">
<body style="font-family:Arial,helvetica,sans-serif;font-size:12pt;
background-color:#EEEEEE">
<xsl:for-each select="breakfast_menu/food">
<div style="background-color:teal;color:white;padding:4px">
<span style="font-weight:bold;color:white">
<xsl:value-of select="name"/></span>
- <xsl:value-of select="price"/>
</div>
<div style="margin-left:20px;margin-bottom:1em;font-size:10pt">
<xsl:value-of select="description"/>
<span style="font-style:italic">
(<xsl:value-of select="calories"/> calories per serving)
</span>
</div>
</xsl:for-each>
</body>
</html>
用过html模板后就觉得这不难看懂,主要是一些标签替换
XSLT 的原理是是在浏览器显示 XML 文件之前,先把它转换为 HTML。由于XSLT 转换是由浏览器完成的,所以减少了浏览器差异性问题。
xml转化为html
相关的xslt库
先转化为dom对象,再用程序完成
xml解析器
xml解析器会把把XML(文件或字符串)转换为XML DOM对象
什么是dom对象,怎么转换,看看js就知道了。
xml文档的读取有跨域问题
php与xml
php通过header("Content-type:text/xml");可以用echo向浏览器发送xml。
要用程序把数据库数据转换成xml,要自己写一些代码
工具
Xml验证器:http://www.w3school.com.cn/xml/xml_validator.asp
概念
XML 声明:如<?xml version="1.0" encoding="ISO-8859-1"?>
CDATA:在一个块内,用<![CDATA[ ……]]>把内容包住,使在该块中可以不用xml实体。
DTD:文档类型定义 (document type definition)
XSD(XML Schema Definition):即XML Schema ,是W3C 支持一种DTD代替者,它的语法基于XML 。
XSL :指扩展样式表语言(EXtensible Stylesheet Language),它的初衷是给xml提供样式显示。由XSLT、XPath 以及 XSL-FO组成。XSLT的主旨更一般化,指可将一种 XML 文档转换为另外一种 XML 文档。口头中,常把XSLT称为XLS。
XSLT:指 XSL 转换(XSL Transformations), 可将一种 XML 文档转换为另外一种 XML 文档,其中一种特例是把XML转换成HTML输出。
Xpath:Xpath是一门在 XML 文档中查找信息的语言,在 XML 文档中通过元素和属性进行导航。 XSLT使用 XPath 在 XML 文档中进行导航,在XSLT中,除开导航,就只剩下怎么替换的问题了。
Xquery:一种xml的查询语言,Xquery之于xml就像sql之于数据库。XQuery是基于XPath上的,单独的 XPath 位置路径本身就是有效的 Xquery。
参考文章
w3c:http://www.w3school.com.cn/xml/xml_syntax.asp
XML入门之十一问答
http://developer.51cto.com/art/200512/15385.htm
通过PHP操作XML入门
http://www.php100.com/html/webkaifa/PHP/PHPyingyong/2009/0421/2884.html
XML是什么,它可以做什么?——写给XML入门者 :
http://blog.csdn.net/cds27/article/details/743409
XML是什么,它可以做什么:http://blog.sina.com.cn/s/blog_5c012cc00100cehm.html
给xml的初学者
http://www.why.com.cn/epublish/node625/node1202/node1209/userobject7ai12694.html