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 部分不能包含字符串 “]]>”,也不允许嵌套的 ,标记 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 格式定义图形。