XML


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" />

field-type


实体

<!ENTITY 实体名称 "实体的值">
<!ENTITY writer "Bill Gates">
<!ENTITY copyright "Copyright W3School.com.cn">
<author>&writer;&copyright;</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;&copyright;</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>

数据类型的限定

data-type

指示器

有七种指示器:

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 格式定义图形。