xml学习笔记
XML学习笔记
详细介绍
1998年2月,W3C正式批准了可扩展标记语言的标准定义,可扩展标记语言可以对文档和数据进行结构化处理,从而能够在部门、客户和供应商之间进行交换,实现动态内容生成,企业集成和应用开发。可扩展标记语言可以使我们能够更准确的搜索,更方便的传送软件组件,更好的描述一些事物。例如电子商务交易等。它被设计用来传输和存储数据;超文本标记语言被设计用来显示数据。它们都是标准通用标记语言的子集。
一、什么是可扩展标记语言?
可扩展标记语言是一种很像超文本标记语言的标记语言。
它的设计宗旨是传输数据,而不是显示数据。
它的标签没有被预定义。您需要自行定义标签。
它被设计为具有自我描述性。
它是W3C的推荐标准。
二、可扩展标记语言(xml)和超文本标记语言(html)之间的差异
它不是超文本标记语言的替代。
它是对超文本标记语言的补充。
它和超文本标记语言为不同的目的而设计:
它被设计用来传输和存储数据,其焦点是数据的内容。
超文本标记语言被设计用来显示数据,其焦点是数据的外观。
超文本标记语言旨在显示信息,而它旨在传输信息。
对它最好的描述是:它是独立于软件和硬件的信息传输工具。
三、可扩展标记语言是W3C的推荐标准
XML 于 1998 年 2 月 10 日成为W3C的推荐标准。
可扩展标记语言是一种元标记语言,即定义了用于定义其他特定领域有关语义的、结构化的标记语言,这些标记语言将文档分成许多部件并对这些部件加以标识。XML 文档定义方式有:文档类型定义(DTD)和XML Schema。DTD定义了文档的整体结构以及文档的语法,应用广泛并有丰富工具支持。XML Schema用于定义管理信息等更强大、更丰富的特征。XML能够更精确地声明内容,方便跨越多种平台的更有意义的搜索结果。它提供了一种描述结构数据的格式,简化了网络中数据交换和表示,使得代码、数据和表示分离,并作为数据交换的标准格式,因此它常被称为智能数据文档。
XML技术已经广泛应用于e-Learning应用系统的开发,大多数的商用e-Learning平台都支持XML标准。一些主要的网络设备制造商,如CISCO、JUNIPER等,生产的网络设备也已提供了对XML的支持,以利于今后基于XML的网络管理。
XML在e-Learning管理中的应用
一、兼容现有协议
XML文档格式的管理信息可以很容易地通过HTTP 协议传输,由于HTTP是建立在TCP之上的,故管理数据能够可靠传输。XML还支持访问XML文档的标准API,如DOM,SAX,XSLT,Xpath等。
二、统一的管理数据存取格式
XML能够以灵活有效的方式定义管理信息的结构。以XML格式存储的数据不仅有良好的内在结构,而且由于它是W3C提出的国际标准,因而受到广大软件提供商的支持,易于进行数据交流和开发。现有网络管理标准如TMN、SNMP等的管理信息库规范决定了网管数据符合层次结构和面向对象原则,这使得以XML格式存储网管数据也非常自然,易于实现。
三、不同应用系统间数据的共享和交互
只要定义一套描述各项管理数据和管理功能的XML语言,用Schema对这套语言进行规定,并且共享这些数据的系统的XML文档遵从这些Schema,那么管理数据和管理功能就可以在多个应用系统之间共享和交互。
四、底层传输的数据更具可读性
网络中传输的底层数据因协议不同而编码规则不同,虽然最终传输时都是二进制位流,但是不同的应用协议需要提供不同的转换机制。这种情况导致管理站在对采用不同协议发送管理信息的被管对象之间进行管理时很难实现兼容。如果协议在数据表示时都采用XML格式进行描述,这样网络之间传递的都是简单的字符流,可以通过相同的XML解析器进行解析,然后根据不同的XML标记,对数据的不同部分进行区分处理,使底层数据更具可读性。
五、它和json都是一种数据交换格式
XML由3个部分构成,它们分别是:文档类型定义(Document Type Definition,DTD),即XML的布局语言;可扩展的样式语言(Extensible Style Language,XSL),即XML的样式表语言;以及可扩展链接语言(Extensible Link Language,XLL)。
(1)DTD
DTD规定了文档的逻辑结构。它可定义文档的语法,而文档的语法反过来也能够让XML语法分析程序确认页面标记使用的合法性。DTD定义了页面的元素、元素的属性及元素和属性间的关系。元素与元素间用起始标记和结束标记来定界,对于空元素,用一个空元素标记来分隔。每一个元素都有一个用名字标识的类型,也称为它的通用标识符,并且它还可以有一个属性说明集。每个属性说明都有一个名字和一个值。理想定义应该面向描述与应用程序相关的数据结构,而不是如何显示数据。就是说,应该把一个元素定义为一个标题行,之后让样式表和脚本定义显示标题行。
DTD不具强制性。对于简单的应用程序来说,开发商不需建立自己的DTD,可以使用预先定义的公共DTD或不使用。即使某个文档已经有DTD,只要文档组织是良好的,语法分析程序也不必对照DTD来检验文档的合法性。服务器可能己执行了检查,所以检验的时间和带宽将得以大幅度节省。
(2)XSL
XSL是用来规定XML文档样式的语言。XSL能使Web浏览器改变原有文档的表示法,例如改变数据的显示顺序,不必再与服务器进行交互通信。通过样式表的变换,同一文档可以显示得更大,或经过折叠只显示外面的一层,或者变为打印格式。
XSL凭借其本身的可扩展性,能够控制无穷无尽的标记,而且控制每个标记的方式也是无穷尽的,这也给Web提供了高级的布局特性。如文本的旋转、多列和独立区域。同时支持国际书写格式,可在一页上混合使用从左至右、从右至左及从上至下的书写格式。就如同XML介于HTML和SGML之间一样,XSL标准是介于CSS和SGMI的文档样式语义和规范语言之间的。
(3)XLL
XLL支持Web上已有的简单链接,而且将进一步扩展链接,包括终结死链接的间接链接及可从服务器中只查询某个元素的相关部分链接等。
超文本标记语言(HTML)仅仅执行历来与超文本系统概念相关的极少功能,仅支持最简单的链接形式,即指向硬编码位置的单向链接,这与XML相比有着很大的差别。在为XML所设想的真正超文本系统中,所有典型的超文本链接机制全部将得到支持,包括:与位置无关命名,双向链接,可在文档外规定和管理的链接,元超链接(如环路、多个窗口),集合链接(多来源),Transc1usion(链接目标文档是链接源文档的一部分),链接属性(链接类型)。
所有这些可通过XLL来实现。由于XML以SGML作为基础,因此,XLL基本上属于Hytime(超媒体/基于时间的结构语言,ISO10744)的一个子集,另外它还遵循文本编码所倡议规定的链接概念。
XML能方便有效地表示结构化数据,这就使得XML可以作为描述和传输数据的手段。使用XML进行数据交换已经成为计算机软件领域的标准技术模式。通过XML实现数据的标准化、结构化,解决了在不同平台、不同系统之间的数据结构/模式的差异,使得数据层在XML技术的支持下统一起来。Web Service全部的规范,技术都是以XML为底层核心和构架基础的,对Web Service而言,SOAP、WSDL和UDDI,都是使用XML作为信息描述和交换的标准手段。XML技术的产生促使了Web Service技术的产生与发展。
实践
写一个xml文件:2016112700.xml
<?xml version="1.0" encoding="UTF-8"?>
<CollegeInformation>
<institute ID="11">
<name>马克思学院</name>
<dean>刘伟</dean>
<sex>男</sex>
<age>55</age>
<contact>13421438757</contact>
</institute>
<institute ID="22">
<name>信息工程学院</name>
<dean>张扬</dean>
<sex>男</sex>
<age>45</age>
<contact>13628434796</contact>
</institute>
<institute ID="33">
<name>数统学院</name>
<dean>王斌</dean>
<sex>男</sex>
<age>43</age>
<contact>13625428852</contact>
</institute>
<institute ID="44">
<name>材料学院</name>
<dean>杨旺</dean>
<sex>男</sex>
<age>53</age>
<contact>17821428407</contact>
</institute>
<institute ID="55">
<name>体育学院</name>
<dean>柳絮</dean>
<sex>女</sex>
<age>56</age>
<contact>15924638747</contact>
</institute>
<institute ID="66">
<name>预科学院</name>
<dean>苏轼</dean>
<sex>男</sex>
<age>45</age>
<contact>15611568991</contact>
</institute>
</CollegeInformation>
用IE浏览器打开(建议用 IE8,用 IE9 以前的版本,其他浏览器和IE8之后都不支持)
打开后的效果
这样显示为正确,如果错误会提示具体哪一行出错
xml的约束:dtd
1、内部写法
<!DOCTYPE CollegeInformation[
<!ELEMENT CollegeInformation (institute*)>
<!ATTLIST institute ID CDATA #REQUIRED>
<!ELEMENT institute (name,dean,sex,age,contact)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT dean (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT contact (#PCDATA)>
]>
2.外部写法(独立文件)
<!DOCTYPE CollegeInformation SYSTEM "2016112700.dtd">
编写 2016112700.dtd 文件(放在同一目录)
<?xml version="1.0" encoding="utf-8"?>
<!ELEMENT CollegeInformation (institute*)>
<!ATTLIST institute ID CDATA #REQUIRED>
<!ELEMENT institute (name,dean,sex,age,contact)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT dean (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT contact (#PCDATA)>
重新编写2016112700.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!--
<!DOCTYPE CollegeInformation SYSTEM "2016112700.dtd">
-->
<!DOCTYPE CollegeInformation[
<!ELEMENT CollegeInformation (institute*)>
<!ATTLIST institute ID CDATA #REQUIRED>
<!ELEMENT institute (name,dean,sex,age,contact)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT dean (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT contact (#PCDATA)>
]>
<CollegeInformation>
<institute ID="11">
<name>马克思学院</name>
<dean>刘伟</dean>
<sex>男</sex>
<age>55</age>
<contact>13421438757</contact>
</institute>
<institute ID="22">
<name>信息工程学院</name>
<dean>张扬</dean>
<sex>男</sex>
<age>45</age>
<contact>13628434796</contact>
</institute>
<institute ID="33">
<name>数统学院</name>
<dean>王斌</dean>
<sex>男</sex>
<age>43</age>
<contact>13625428852</contact>
</institute>
<institute ID="44">
<name>材料学院</name>
<dean>杨旺</dean>
<sex>男</sex>
<age>53</age>
<contact>17821428407</contact>
</institute>
<institute ID="55">
<name>体育学院</name>
<dean>柳絮</dean>
<sex>女</sex>
<age>56</age>
<contact>15924638747</contact>
</institute>
<institute ID="66">
<name>预科学院</name>
<dean>苏轼</dean>
<sex>男</sex>
<age>45</age>
<contact>15611568991</contact>
</institute>
</CollegeInformation>
运行效果
跟之前一样,如果dtd编写出错,会有提示
使用样式(xsl)
编写 2016112700.xsl 文件
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<h3 align="center">学院信息一览表</h3>
<xsl:apply-templates select="CollegeInformation"/>
</xsl:template>
<xsl:template match="CollegeInformation">
<table align="center" border="1" cellpadding="15" bordercolor="black">
<thead>
<tr align="center">
<th>院号</th>
<th>学院名</th>
<th>院长</th>
<th>性别</th>
<th>年龄</th>
<th>联系方式</th>
</tr>
</thead>
<xsl:apply-templates select="institute"/>
</table>
</xsl:template>
<xsl:template match="institute">
<tbody>
<tr align="center">
<td><xsl:value-of select="@ID"/></td>
<td><xsl:value-of select="name"/></td>
<td><xsl:value-of select="dean"/></td>
<td><xsl:value-of select="sex"/></td>
<td><xsl:value-of select="age"/></td>
<td><xsl:value-of select="contact"/></td>
</tr>
</tbody>
</xsl:template>
</xsl:stylesheet>
在2016112700.xml中引用xsl文件
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="2016112700.xsl"?>
<!DOCTYPE CollegeInformation SYSTEM "2016112700.dtd">
<CollegeInformation>
<institute ID="11">
<name>马克思学院</name>
<dean>刘伟</dean>
<sex>男</sex>
<age>55</age>
<contact>13421438757</contact>
</institute>
<institute ID="22">
<name>信息工程学院</name>
<dean>张扬</dean>
<sex>男</sex>
<age>45</age>
<contact>13628434796</contact>
</institute>
<institute ID="33">
<name>数统学院</name>
<dean>王斌</dean>
<sex>男</sex>
<age>43</age>
<contact>13625428852</contact>
</institute>
<institute ID="44">
<name>材料学院</name>
<dean>杨旺</dean>
<sex>男</sex>
<age>53</age>
<contact>17821428407</contact>
</institute>
<institute ID="55">
<name>体育学院</name>
<dean>柳絮</dean>
<sex>女</sex>
<age>56</age>
<contact>15924638747</contact>
</institute>
<institute ID="66">
<name>预科学院</name>
<dean>苏轼</dean>
<sex>男</sex>
<age>45</age>
<contact>15611568991</contact>
</institute>
</CollegeInformation>
运行效果
为表格添加颜色
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<h3 align="center">学院信息一览表</h3>
<xsl:apply-templates select="CollegeInformation"/>
</xsl:template>
<xsl:template match="CollegeInformation">
<table align="center" border="1" cellpadding="15" bordercolor="black">
<thead>
<tr align="center" style="background-color:pink">
<th>院号</th>
<th>学院名</th>
<th>院长</th>
<th>性别</th>
<th>年龄</th>
<th>联系方式</th>
</tr>
</thead>
<xsl:apply-templates select="institute"/>
</table>
</xsl:template>
<xsl:template match="institute">
<tbody>
<xsl:choose>
<xsl:when test="boolean(position()mod 2=1)">
<tr align="center" style="background-color:yellowgreen">
<td><xsl:value-of select="@ID"/></td>
<td><xsl:value-of select="name"/></td>
<td><xsl:value-of select="dean"/></td>
<td><xsl:value-of select="sex"/></td>
<td><xsl:value-of select="age"/></td>
<td><xsl:value-of select="contact"/></td>
</tr>
</xsl:when>
<xsl:when test="boolean(position()mod 2=0)">
<tr align="center" style="background-color:green">
<td><xsl:value-of select="@ID"/></td>
<td><xsl:value-of select="name"/></td>
<td><xsl:value-of select="dean"/></td>
<td><xsl:value-of select="sex"/></td>
<td><xsl:value-of select="age"/></td>
<td><xsl:value-of select="contact"/></td>
</tr>
</xsl:when>
</xsl:choose>
</tbody>
</xsl:template>
</xsl:stylesheet>
运行效果
一行显示 两条 数据
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<h3 align="center">学院信息一览表</h3>
<table align="center" border="1" cellpadding="15" bordercolor="black">
<tr align="center" style="background-color:pink">
<th>院号</th>
<th>学院名</th>
<th>院长</th>
<th>性别</th>
<th>年龄</th>
<th>联系方式</th>
<th>院号</th>
<th>学院名</th>
<th>院长</th>
<th>性别</th>
<th>年龄</th>
<th>联系方式</th>
</tr>
<xsl:apply-templates select="CollegeInformation"/>
</table>
</xsl:template>
<xsl:template match="CollegeInformation">
<tr align="center" style="background-color:green">
<xsl:apply-templates select="institute"/>
</tr>
</xsl:template>
<xsl:template match="institute">
<td><xsl:value-of select="@ID"/></td>
<td><xsl:value-of select="name"/></td>
<td><xsl:value-of select="dean"/></td>
<td><xsl:value-of select="sex"/></td>
<td><xsl:value-of select="age"/></td>
<td><xsl:value-of select="contact"/></td>
<xsl:if test="not(position()=last()) and position() mod 2=0">
<xsl:choose>
<xsl:when test="boolean(position() = 2)">
<xsl:text disable-output-escaping="yes"></tr><tr align="center" style="background-color:yellowgreen""></xsl:text>
</xsl:when>
<xsl:when test="boolean(position() = 4)">
<xsl:text disable-output-escaping="yes"></tr><tr align="center" style="background-color:green""></xsl:text>
</xsl:when>
</xsl:choose>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
运行效果
数据岛
编写 2016112700.html 文件来抓取资料
<html>
<head>
<title>test</title>
</head>
<script type="text/javascript">
function Previous()
{
if(!CI.recordset.EOF)
{
CI.recordset.MovePrevious();
if(CI.recordset.BOF)
{
CI.recordset.MoveFirst();
}
}
}
function Next()
{
if(!CI.recordset.BOF)
{
CI.recordset.moveNext();
if(CI.recordset.EOF)
{
CI.recordset.moveLast();
}
}
}
</script>
<body>
<xml src="2016112700.xml" id="CI">
</xml>
<table border=1 >
<tr>
<td>院号</td>
<td><span datasrc="#CI" datafld="ID" /></td>
</tr>
<tr>
<td>学院名</td>
<td><span datasrc="#CI" datafld="name" /></td>
</tr>
<tr>
<td>性别</td>
<td><span datasrc="#CI" datafld="sex" /></td>
</tr>
<tr>
<td>年龄</td>
<td><span datasrc="#CI" datafld="age" /></td>
</tr>
<tr>
<td>院长</td>
<td><span datasrc="#CI" datafld="dean" /></td>
</tr>
<tr>
<td>联系方式</td>
<td><span datasrc="#CI" datafld="contact" /></td>
</tr>
<tr>
<td colspan="2">
<input type="button" id="p" onclick="Previous()" value="前一条" />
<input type="button" id="next" onclick="Next()" value="后一条" />
</td>
</tr>
</table>
</body>
</html>
运行效果
xml -> 整个XML数据岛
url -> 引入外部XML文件的路径
documentElement -> XML数据岛的根节点,利用根节点我们可以增,删,改,查XML数据岛上的节点,树节点操作
recordset -> XML树返回的ADO(ActiveX Data Objects)记录集。
它一般有如下属性可供使用:
absolutePosition -> 当前记录在全部记录中所在位置
RecordCount -> 总的记录数
BOF -> 第一行的上一行,bool类型,一般用来判断是否记录已经到了最前面
EOF -> 最后一行的下一行,bool类型,一般用来判断是否到最后面了
pageSize -> recordset每页可以显示的记录数,默认值是10,可以自己设置,table中设置的datapagesize最好跟这个值保持一致
absolutePage -> 当前记录所在页,根据RecordCount 和absolutePosition和pageSize计算得到
pageCount ->总页数,根据RecordCount和pageSize计算得到
recordset的方法:
addNew ->创建一条空记录
move(n) ->移动记录指针
moveFirst ->指针移动到第一条记录
moveLast ->指针移动到最后一条记录
movePrevious->指针移动到上一条记录
moveNext->指针移动到下一条记录
使用 dom 抓取数据
编写2016112700DomOfXml.html文件
<html>
<head>
<title>test</title>
</head>
<script language="javascript">
var i = -1;
var orderDoc = new ActiveXObject ("MSXML2.DOMDocument.3.0");
orderDoc.load("2016112700.xml");
var items = orderDoc.documentElement.selectNodes("/CollegeInformation/institute");
//获得结点文本
function getNode(doc, xpath) {
var retval = "";
var value = doc.documentElement.selectSingleNode(xpath);
if (value) retval = value.text;
return retval;
}
//下一条记录
function getDataNext() {
i++;
if (i > items.length - 1) i = 0;
document.forms[0].name.value = getNode(orderDoc, "/CollegeInformation/institute[" + i + "]/name");
document.forms[0].dean.value = getNode(orderDoc, "/CollegeInformation/institute[" + i + "]/dean");
document.forms[0].sex.value = getNode(orderDoc, "/CollegeInformation/institute[" + i + "]/sex");
document.forms[0].age.value = getNode(orderDoc,"/CollegeInformation/institute[" + i + "]/age");
document.forms[0].contact.value = getNode(orderDoc, "/CollegeInformation/institute[" + i + "]/contact");
}
//前一条记录
function getDataPrev() {
i--;
if (i < 0) i = items.length - 1;
document.forms[0].name.value = getNode(orderDoc, "/CollegeInformation/institute[" + i + "]/name");
document.forms[0].dean.value = getNode(orderDoc, "/CollegeInformation/institute[" + i + "]/dean");
document.forms[0].sex.value = getNode(orderDoc, "/CollegeInformation/institute[" + i + "]/sex");
document.forms[0].age.value = getNode(orderDoc,"/CollegeInformation/institute[" + i + "]/age");
document.forms[0].contact.value = getNode(orderDoc, "/CollegeInformation/institute[" + i + "]/contact");
}
</script>
<body onload="getDataNext()">
<form>
<table border="0">
<tr>
<td>学院名</td>
<td><input type="text" name="name"></td>
</tr>
<tr>
<td>院长</td>
<td><input type="text" name="dean"></td>
</tr>
<tr>
<td>性别</td>
<td><input type="text" name="sex"></td>
</tr>
<tr>
<td>年龄</td>
<td><input type="text" name="age"></td>
</tr>
<tr>
<td>联系方式</td>
<td><input type="text" name="contact"></td>
</tr>
</table>
<input type="button" value="<<<" onClick="getDataPrev()">
<input type="button" value=">>>" onClick="getDataNext()">
</form>
</body>
</html>
运行效果
显示多条数据
编写2016112700moreData.html文件
<html>
<head>
<title>test</title>
</head>
<body>
<xml id="users" encoding="utf-8" src="2016112700.xml" />
<!-- DATAPAGESIZE控制显示数据条数-->
<table align="center" id="datatable" datasrc="#users" DATAPAGESIZE="2" width="666" border="1">
<thead>
<tr>
<th>院号</th>
<th>学院名</th>
<th>性别</th>
<th>年龄</th>
<th>院长</th>
<th>联系方式</th>
</tr>
</thead>
<tbody>
<tr align="center">
<td><span datafld="ID"></span></td>
<td><span datafld="name"></span></td>
<td><span datafld="sex"></span></td>
<td><span datafld="age"></span></td>
<td><span datafld="dean"></span></td>
<td><span datafld="contact"></span></td>
</tr>
</tbody>
<tfoot align="center">
<td colspan="3"><button onclick="document.all.datatable.previousPage()">Previous Page</button></td>
<td colspan="3"><button onclick="document.all.datatable.nextPage()">Next Page</button></td>
</tfoot>
</table>
</body>
</html>
运行效果
目录
项目源码
学习网站:
1、搜狗百科xml
2、w3cschool
3、菜鸟教程
今天笔记结束
上一篇: Golang学习--包管理工具glide
下一篇: php接口返回xml格式