XML 文档可以包含非 ASCII 字符,为了避免错误,需要规定 XML 编码,或者将 XML 文档存为 Unicode,两者需要保持一致。
必须包含根元素,该元素是所有其他元素的父元素。
所有元素都必须有关闭标签
对大小写敏感
属性值须加引号,如果属性本身包含引号,就用单引号包围属性
<
和 &
是非法的,用实体引用代替
文档中的空格不会被删节,而html只会保留1个
XML以 LF
存储换行
名称不能以数字或者标点符号或“xml”(或者 XML、Xml)开始,不能包含空格,避免-.:
字符
元数据(有关数据的数据)应当存储为属性,而数据本身应当存储为元素。
Internet Explorer 5 拥有对 XML 的支持,但是 XSL 部分与 W3C 的官方标准不兼容!
NameSpace
XML 命名空间属性被放置于元素的开始标签之中,并使用以下的语法:
xmlns:namespace-prefix="namespaceURI"
默认的命名空间,省去前缀:
xmlns="namespaceURI"
构建模块
-
元素
-
属性
-
实体
-
PCDATA:会被解析器解析的文本,这些文本将被解析器检查实体以及标记。解析器将能识别PCDATA包含的元素,并将其作为节点
-
CDATA:不会被解析器解析的文本。某些文本,比如 JavaScript 代码,包含大量 “<” 或 “&” 字符。为了避免错误,可以将脚本代码定义为 CDATA。
CDATA 部分由 “<![CDATA[
” 开始,由 “]]>
” 结束,包含的内容将被解析器忽略,CDATA 部分不能包含字符串 “]]>”,也不允许嵌套的 ,标记 CDATA 部分结尾的 “]]>” 不能包含空格或折行。:
<script>
<![CDATA[
function matchwo(a,b)
{
if (a < b && a < 0) then
{
return 1;
}
else
{
return 0;
}
}
]]>
</script>
CSS
XML文本展示效果可以被CSS渲染,建议使用XSLT
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/css" href="cd_catalog.css"?>
XSLT
XSLT 是首选的 XML 样式表语言。 XSLT (eXtensible Stylesheet Language Transformations) 远比 CSS 更加完善,XSLT 可以把 XML 文档转换为其他格式,比如 XHTML。 XSLT
DTD
DTD:XML Type Definition ,文档类型定义,建议使用XSD
XML文档定义:
<!DOCTYPE 根元素 [元素声明]>
<?xml version="1.0"?>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (# PCDATA)>
<!ELEMENT from (# PCDATA)>
<!ELEMENT heading (# PCDATA)>
<!ELEMENT body (# PCDATA)>
]>
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
!ELEMENT note
(第三行)定义 note 元素有四个元素:”to、from、heading,、body”
!ELEMENT to
(第四行)定义 to 元素为 “# PCDATA
” 类型
外部DTD
<!DOCTYPE 根元素 SYSTEM "文件名">
<?xml version="1.0"?>
<!DOCTYPE note SYSTEM "note.dtd">
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (# PCDATA)>
<!ELEMENT from (# PCDATA)>
<!ELEMENT heading (# PCDATA)>
<!ELEMENT body (# PCDATA)>
元素
声明元素
<!ELEMENT 元素名称 类别>
<!ELEMENT 元素名称 (元素内容)>
空元素
<!ELEMENT 元素名称 EMPTY>
只有 PCDATA 的元素
<!ELEMENT 元素名称 (# PCDATA)>
带有任何内容的元素
<!ELEMENT 元素名称 ANY>
带有子元素(序列)的元素
当子元素按照由逗号分隔开的序列进行声明时,这些子元素必须按照相同的顺序出现在文档中。在一个完整的声明中,子元素也必须被声明,同时子元素也可拥有子元素。
<!ELEMENT 元素名称 (子元素名称 1,子元素名称 2,.....)>
声明元素重复出现的次数,重复标记与正则表达式相同
声明只出现一次的元素
<!ELEMENT 元素名称 (子元素名称)>
声明最少出现一次的元素
<!ELEMENT 元素名称 (子元素名称+)>
声明出现零次或多次的元素
<!ELEMENT 元素名称 (子元素名称*)>
声明出现零次或一次的元素
<!ELEMENT 元素名称 (子元素名称?)>
声明“或”类型的内容,第四个元素可以为message或body
<!ELEMENT note (to,from,header,(message|body))>
声明混合型的内容
<!ELEMENT note (# PCDATA|to|from|header|message)*>
属性
声明属性
<!ATTLIST 元素名称 属性名称 属性类型 默认值>
<!ATTLIST payment type CDATA "check">
<payment type="check" />
实体
<!ENTITY 实体名称 "实体的值">
<!ENTITY writer "Bill Gates">
<!ENTITY copyright "Copyright W3School.com.cn">
<author>&writer;©right;</author>
外部实体声明
<!ENTITY 实体名称 SYSTEM "URI/URL">
<!ENTITY writer SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
<!ENTITY copyright SYSTEM "http://www.w3school.com.cn/dtd/entities.dtd">
<author>&writer;©right;</author>
验证
javascript验证,load( ) 方法用于文件,而 loadXML( ) 方法用于字符串,validateOnParse设为false关闭验证
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async="false";
xmlDoc.validateOnParse="true";
xmlDoc.load("note_dtd_error.xml");
XSD
XML Schema Definition,文档模式定义,是基于 XML 的 DTD 替代物。
与 DTD 不同,XML Schema 支持数据类型和命名空间。
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3school.com.cn"
xmlns="http://www.w3school.com.cn"
elementFormDefault="qualified">
<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>
</xs:schema>
xmlns:xs 显示 schema 中用到的元素和数据类型来自哪个命名空间,同时它还规定了来自此命名空间的元素和数据类型应该使用前缀 xs;
targetNamespace 显示被此 schema 定义的元素 (note, to, from, heading, body) 来自哪个命名空间, 这意味着,如果在xml文档中使用此命名空间,那么定义的元素将可以被使用,如果不同的命名空间含有同名元素,使用前缀区分。
elementFormDefault=”qualified” 指出任何 XML 实例文档所使用的且在此 schema 中声明过的元素必须被命名空间限定。
<?xml version="1.0"?>
<note
xmlns="http://www.w3school.com.cn"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3school.com.cn note.xsd">
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
一旦拥有了可用的 XML Schema 实例命名空间:xmlns:xsi
就可以使用 schemaLocation 属性来注册命名空间,只有注册的命名空间可以被使用。此属性有两个值,第一个值是需要使用的命名空间,第二个值是供命名空间使用的 XML schema 的位置:xsi:schemaLocation
元素
<schema>
元素是每一个 XML Schema 的根元素
简易元素
<xs:element name="xxx" type="yyy"/>
常用类型: xs:string xs:decimal xs:integer xs:boolean xs:date xs:time 缺省值
<xs:element name="color" type="xs:string" default="red"/>
固定值
<xs:element name="color" type="xs:string" fixed="red"/>
复合元素
子元素包围在 <sequence>
中,这意味着子元素必须以它们被声明的次序出现。
声明形式,这种类型是employee独有的
<xs:element name="employee">
<xs:complexType>
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
引用形式,这种类型是共享的
<xs:element name="employee" type="personinfo"/>
<xs:complexType name="personinfo">
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
类型扩展
<xs:element name="employee" type="fullpersoninfo"/>
<xs:complexType name="personinfo">
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="fullpersoninfo">
<xs:complexContent>
<xs:extension base="personinfo">
<xs:sequence>
<xs:element name="address" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
<xs:element name="country" type="xs:string"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
复合空元素
<xs:element name="product">
<xs:complexType>
<xs:complexContent>
<xs:restriction base="xs:integer">
<xs:attribute name="prodid" type="xs:positiveInteger"/>
</xs:restriction>
</xs:complexContent>
</xs:complexType>
</xs:element>
<xs:element name="product">
<xs:complexType>
<xs:attribute name="prodid" type="xs:positiveInteger"/>
</xs:complexType>
</xs:element>
<xs:element name="product" type="prodtype"/>
<xs:complexType name="prodtype">
<xs:attribute name="prodid" type="xs:positiveInteger"/>
</xs:complexType>
仅含元素复合类型
<xs:element name="person">
<xs:complexType>
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="person" type="persontype"/>
<xs:complexType name="persontype">
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
仅含文本复合类型
<xs:element name="某个名称">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="basetype">
....
....
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="某个名称">
<xs:complexType>
<xs:simpleContent>
<xs:restriction base="basetype">
....
....
</xs:restriction>
</xs:simpleContent>
</xs:complexType>
</xs:element>
混合内容复合类型
<xs:element name="letter">
<xs:complexType mixed="true">
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="orderid" type="xs:positiveInteger"/>
<xs:element name="shipdate" type="xs:date"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="letter" type="lettertype"/>
<xs:complexType name="lettertype" mixed="true">
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="orderid" type="xs:positiveInteger"/>
<xs:element name="shipdate" type="xs:date"/>
</xs:sequence>
</xs:complexType>
属性
<xs:attribute name="xxx" type="yyy"/>
常用类型与元素相同
默认值与固定值用法与元素相同
可选的和必需的属性,在缺省的情况下,属性是可选的。如需规定属性为必选,请使用 “use” 属性:
<xs:attribute name="lang" type="xs:string" use="required"/>
限定 / Facets
对值的限定
<xs:element name="age">
<xs:simpleType>
<xs:restriction base="xs:integer">
<xs:minInclusive value="0"/>
<xs:maxInclusive value="120"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
枚举限定
<xs:element name="car">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="Audi"/>
<xs:enumeration value="Golf"/>
<xs:enumeration value="BMW"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
也可以写成
<xs:element name="car" type="carType"/>
<xs:simpleType name="carType">
<xs:restriction base="xs:string">
<xs:enumeration value="Audi"/>
<xs:enumeration value="Golf"/>
<xs:enumeration value="BMW"/>
</xs:restriction>
</xs:simpleType>
对一系列值的限定 模式约束(pattern constraint),类似于正则
<xs:element name="password">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[a-zA-Z0-9]{8}"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
对空白字符的限定
preserve,不会移除任何空白字符
replace, 将移除所有空白字符(换行、回车、空格以及制表符)
collapse,移除所有空白字符(换行、回车、空格以及制表符会被替换为空格,开头和结尾的空格会被移除,而多个连续的空格会被缩减为一个单一的空格)
<xs:element name="address">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:whiteSpace value="preserve"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
对长度的限定
<xs:element name="password">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:length value="8"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="password">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:minLength value="5"/>
<xs:maxLength value="8"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
数据类型的限定
指示器
有七种指示器:
Order 指示器:用于定义元素的顺序,标签
-
All:子元素可以按照任意顺序出现,且每个子元素必须只出现1次
-
Choice:可出现某个子元素或者可出现另外一个子元素(非此即彼)
-
Sequence:子元素必须按照特定的顺序出现:
Occurrence 指示器:用于定义某个元素出现的频率,属性
-
maxOccurs:规定某个元素可出现的最大次数,(maxOccurs=”unbounded”表示不受限制)
-
minOccurs:规定某个元素可出现的最小次数
Group 指示器:定义相关的数批元素,标签
-
Group name:必须在 group 声明内部定义一个 all、choice 或者 sequence 元素,通过
<xs:group ref="group"/>
引用 -
attributeGroup name:属性组通过 attributeGroup 声明来进行定义,子元素为
attribute
,通过<xs:attributeGroup ref="personattrgroup"/>
引用
any
<any>
元素使我们有能力通过未被 schema 规定的元素来拓展 XML 文档,
定义<any>
元素,表示此处添加任何由其他 schema 规定的元素
<xs:element name="person">
<xs:complexType>
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
<xs:any minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
anyAttribute
<anyAttribute>
元素使我们有能力通过未被 schema 规定的属性来扩展 XML 文档,
定义<anyAttribute>
元素,表示此处添加任何由其他 schema 规定的属性
<xs:element name="person">
<xs:complexType>
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
<xs:anyAttribute/>
</xs:complexType>
</xs:element>
元素替换
可替换元素的类型必须和主元素相同,或者从主元素衍生而来。假如可替换元素的类型与主元素的类型相同,那么您就不必规定可替换元素的类型了。
请注意,substitutionGroup 中的所有元素(主元素和可替换元素)必须被声明为全局元素,否则就无法工作!
全局元素指 “schema” 元素的直接子元素!本地元素(Local elements)指嵌套在其他元素中的元素。
首先,我们声明主元素,然后我们会声明次元素,这些次元素可声明它们能够替换主元素。
<xs:element name="name" type="xs:string"/>
<xs:element name="navn" substitutionGroup="name"/>
<xs:complexType name="custinfo">
<xs:sequence>
<xs:element ref="name"/>
</xs:sequence>
</xs:complexType>
<xs:element name="customer" type="custinfo"/>
<xs:element name="kunde" substitutionGroup="customer"/>
复合此规定的xml文档格式:
<customer>
<name>John Smith</name>
</customer>
或者
<kunde>
<navn>John Smith</navn>
</kunde>
阻止元素替换
<xs:element name="name" type="xs:string" block="substitution"/>
数据类型
略,详见W3C
DOM
获取元素值
x=xmlDoc.getElementsByTagName("title")[0].childNodes[0];
txt=x.nodeValue;
获取属性值
txt=xmlDoc.getElementsByTagName("title")[0].getAttribute("lang");
改变元素的值
x=xmlDoc.getElementsByTagName("title")[0].childNodes[0];
x.nodeValue="Easy Cooking";
改变属性的值
x=xmlDoc.getElementsByTagName("book");
for(i=0;i<x.length;i++)
{
x[i].setAttribute("edition","first");
}
创建元素
newel=xmlDoc.createElement("edition"); //创建新的元素节点。
newtext=xmlDoc.createTextNode("First"); //创建新的文本节点
newel.appendChild(newtext); //向节点添加子节点
x=xmlDoc.getElementsByTagName("book");
x[0].appendChild(newel);
删除元素
x=xmlDoc.getElementsByTagName("book")[0];
x.removeChild(x.childNodes[0]);
解析器
js解析xml
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.open("GET","books.xml",false);
xmlhttp.send();
xmlDoc=xmlhttp.responseXML;
js解析字符串
txt="<bookstore><book>";
txt=txt+"<title>Everyday Italian</title>";
txt=txt+"<author>Giada De Laurentiis</author>";
txt=txt+"<year>2005</year>";
txt=txt+"</book></bookstore>";
if (window.DOMParser)
{
parser=new DOMParser();
xmlDoc=parser.parseFromString(txt,"text/xml");
}
else // Internet Explorer
{
xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async="false";
//loadXML() 方法用于加载字符串(文本),load() 用于加载文件
xmlDoc.loadXML(txt);
}
访问xml节点
xmlDoc.getElementsByTagName("to")[0].childNodes[0].nodeValue
XMLHttpRequest
var xmlhttp;
function loadXMLDoc(url)
{
xmlhttp=null;
if (window.XMLHttpRequest)
{// code for all new browsers
xmlhttp=new XMLHttpRequest();
}
else if (window.ActiveXObject)
{// code for IE5 and IE6
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.readyState==4)
{// 4 = "loaded"
if (xmlhttp.status==200)
{// 200 = OK
// ...our code here...
}
else
{
alert("Problem retrieving XML data");
}
}
}
衍生产品
-
XHTML 更严格更纯净的基于 XML 的 HTML 版本。
-
XML DOM 访问和操作 XML 的标准文档模型。
-
XSLT XSL 包含三个部分: XSLT - 把 XML 转换为其他格式,比如 HTML XSL-FO - 用于格式化 XML 文档的语言 XPath - 用于在 XML 文档中导航的语言
-
XQuery 基于 XML 的用于查询 XML 数据的语言。
-
DTD 用于定义 XML 文档中的合法元素的标准。
-
XSD XML Schema。基于 XML 的 DTD 替代物。
-
XLink 在 XML 文档中创建超级链接的语言。
-
XPointer 允许 XLink 超级链接指向 XML 文档中更多具体的部分。
-
XForms 使用 XML 定义表单数据。
-
SOAP 允许应用程序在 HTTP 之上交换信息的基于 XML 的协议。
-
WSDL 用于描述网络服务的基于 XML 的语言。
-
RDF 用于描述网络资源的基于 XML 的语言。
-
RSS 聚合新闻以及类新闻站点内容的格式。
-
WAP 用于在无线设备上(比如移动电话)显示内容的一种基于 XML 的语言。
-
SMIL 描述视听呈现的语言。
-
SVG 使用 XML 格式定义图形。