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 部分结尾的 ]]>
不能包含空格或折行。:
<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 格式定义图形。