XML解析
Extensible Markup Language
:可扩展置标语言,可扩展标记语言或可延伸 标示语言,是一种置标语言
当今,XML 是非常重要的技术,并且开发项目正在使用这些基于 XML 的技术:
- 用 XML Schema 定义 XML 的结构和数据类型
- 用 XSLT 来转换 XML 数据
- 用 SOAP 来交换应用程序之间的 XML 数据
- 用 WSDL 来描述网络服务
- 用 RDF 来描述网络资源
- 用 XPath 和 XQuery 来访问 XML 数据
- 用 SMIL 来定义图形
XML基础
简介
(1).什么是XML?
- XML指可扩展标记语言
- XML的设计宗旨是传输数据,而非显示数据
- XML标签没有被预定义,需要自行定义标签
- XML被设计为具有自我描述性
- XML是W3C的推荐标准
- XML以纯文本格式存储,是独立于软件和硬件的信息传输工具
(2).XML&HTML
- XML被设计为传输和存储数据,其焦点是数据的内容
- XML被设计用来显示数据,其焦点是数据的外观
树结构
<?xml version="1.0" encoding="ISO-8859-1"?>
<root>
<firstLeaf>firstValue</firstLeaf>
<SecondLeaf>SecondValue</SecondLeaf>
</root>
- 声明:定义XML版本(1.0),使用编码(ISO-8859-1)
- 根元素:
root
- 子元素:
firstLeaf
SecondLeaf
语法
-
XML 文档必须有关闭标签
-
XML标签对大小写敏感
-
XML必须有根元素
-
XML的属性值需加引号
-
XML 元素必须被正确的嵌套
-
XML部分字符需要使用实体引用
实体引用 特殊符号 意义 <
< 小于 >
> 大于 &
& 与 '
’ 单引号 "
" 引号 -
XML的注释
<!-- -->
-
XML空格会被保留,HTML连续的多个空格会合并为一个
-
XML以LF存储换行,Unix中新行以LF字符存储新行,Window换行以CR(回车符)和LF(换行符)存储
属性VS子元素
<person sex="female">
<firstname>Anna</firstname>
<lastname>Smith</lastname>
</person>
<person>
<sex>female</sex>
<firstname>Anna</firstname>
<lastname>Smith</lastname>
</person>
以上例子通过属性和子元素都能提供相同的信息,对于什么时候使用元素或属性并没有严格的要求,经验上说,属性便利,但是如果数据感觉像信息,那么最好使用子元素
- 属性无法博涵多重的值,子元素可以
- 属性无法描述树结构,子元素可以
- 属性不易扩展,且难以阅读和维护
- 元数据(有关数据的数据)应当存储为属性,数据本身应当存储为元素
验证
(1).拥有正确语法的XML被称为“形式良好"的XML,通过DTD验证的XML是”合法“的XML
<!DOCTYPE *** SYSTEM "***.dtd">
上述例子中,DOCTYPE声明是对外部DTD文件的引用,DTD文件作用是定义XML文档的结构。它使用一系列合法的元素来定义文档结构
Q&A:DTD是什么?
DTD(文档类型定义)的作用是定义XML文档的合法构建模块,它使用一系列的合法元素定义文档结构,它可被成行地声明于XML文档中,也可作为外部引用
内部声明
<?xml version="1.0"?>
<!-- 定义此文档是note类型的文档
定义note元素有四个元素:to,from,heading,body
定义元素类型为"#PCDATA"类型-->
<!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>
外部引用
<?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>
包含DTD的"note.dtd"文件
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
为什么使用DTD?
通过DTD,可以达到校验数据的作用,独立的团体可以一致地使用某个标准地DTD来交换数据
数据类型
PCDATA | CDATA |
---|---|
被解析的字符数据 | 字符数据 |
解析器会检查文本的实体以及标记 | 不会检查 |
标签作为标记处理,实体会展开 | 标签不作为标记对待,实体不展开 |
(2).W3C支持一种基于XML的DTD的代替者,它名为XML Schema
<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>
Q&A:Schema是什么?
XML Schema是基于XML的DTD代替者,XML Schema描述XML文档的结构,XML Schema语言也被称作XML Schema定义(XML Schema Definition**,XSD**)
XSD的作用
- 定义可出现在文档中的元素
- 定义可出现在文档中的属性
- 定义哪个元素是子元素
- 定义子元素的次序
- 定义子元素的数目
- 定义元素是否为空,或者是否包含文本
- 定义元素和属性的数据类型
- 定义元素和属性的默认值以及固定值
XSD较于DTD的优点
- XSD可针对未来的需求进行扩展
- XSD更完善,功能更强大
- XSD基于XML编写
- XSD支持数据类型
- XSD支持命名空间
XSD在2001年5月2日成为W3C标准
XSD文件
<!-- 这是一个XSD文件 -->
<?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>
<schema>
元素是每一个XSD的根元素,<schema>
元素可包含属性,如下:
xmlns:xs="http://www.w3.org/2001/XMLSchema"
显示schema中用到的元素和数据类型来自命名空间http://www.w3.org/2001/XMLSchema
,同时规定来自命名空间的元素和数据类型应该使用前缀xs
targetNamespace="http://www.w3school.com.cn"
显示被此schema定义的元素(note,to,from,heading,body)来自命名空间http://www.w3school.com.cn
xmlns="http://www.w3school.com.cn"
指出默认的命名空间是http://www.w3school.com.cn
elementFormDefault="qualified"
指出任何XML实例文档所使用的且在此schema中声明过的元素必须被命名空间限定
XML对XSD的引用
<!-- 这是XML对XSD的引用 -->
<?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>
xmlns="http://www.w3school.com.cn"
规定了默认命名空间的声明,此声明会告知schema验证器,在此XML文档中所使用的的所有元素都被声明于http://www.w3school.com.cn
这个命名空间
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
指拥有了可用的XSD实例命名空间
xsi:schemaLocation="http://www.w3school.com.cn note.xsd"
拥有了XSD实例命名空间,就可以使用schemaLocation属性了,此属性的两个值,http://www.w3school.com.cn
指需要使用的命名空间,note.xsd
指供命名空间使用的XSD的位置
验证器
如果XML文档存在错误,那么程序就不应当继续处理这个文档。
XML CSS
CATALOG
{
background-color: #ffffff;
width: 100%;
}
CD
{
display: block;
margin-bottom: 30pt;
margin-left: 0;
}
TITLE
{
color: #FF0000;
font-size: 20pt;
}
ARTIST
{
color: #0000FF;
font-size: 20pt;
}
COUNTRY,PRICE,YEAR,COMPANY
{
display: block;
color: #000000;
margin-left: 20pt;
}
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/css" href="cd_catalog.css"?>
<CATALOG>
<CD>
<TITLE>Empire Burlesque</TITLE>
<ARTIST>Bob Dylan</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Columbia</COMPANY>
<PRICE>10.90</PRICE>
<YEAR>1985</YEAR>
</CD>
</CATALOG>
XML XSLT
XSLT是首选的XML样式表语言,它远比CSS更加完善
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/xsl" href="simple.xsl"?>
<breakfast_menu>
<food>
<name>Belgian Waffles</name>
<price>$5.95</price>
<description>
two of our famous Belgian Waffles
</description>
<calories>650</calories>
</food>
</breakfast_menu>
Q&A:XSL与XSLT是什么关系?
XSL和XSLT从狭义上理解是一样的,XSLT为XSL Transformations
(XSL转化)
XSL:扩展样式表语言(EXtensible Stylesheet Language)是用来网页展现的,是把一个xml文件转换成一个html文件,它包含三部分
- XSLT:一种用于转换XML文档语言(XSLT是XSL最重要的部分)
- XPath:一种用于在XML文档中导航的语言(XSLT 使用 XPath 在 XML 文档中进行导航)
- XSL-FO:一种用于格式化XML文档的语言(XPath 是一个 W3C 标准)
<?xml version="1.0" encoding="UTF-8"?>
<!-- 1.声明部分 -->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<!-- 2.用于构建模板 -->
<xsl:template match="/">
<HTML>
<HEAD>
<TITLE>成绩单</TITLE>
</HEAD>
<BODY>
<!-- 3.将模板应用于当前元素 -->
<xsl:apply-templates select="document"/>
</BODY>
</HTML>
</xsl:template>
<xsl:template match="document">
<TABLE border="1" cellspacing="0">
<TH>姓名</TH>
<TH>英语</TH>
<TH>数学</TH>
<TH>化学</TH>
<xsl:apply-templates select="grade"/>
</TABLE>
</xsl:template>
<xsl:template match="grade">
<TR>
<TD><xsh:apply-templates select="name"/></TD>
<TD><xsh:apply-templates select="english"/></TD>
<TD><xsh:apply-templates select="math"/></TD>
<TD><xsh:apply-templates select="chymest"/></TD>
<TD><xsh:apply-templates select="chymest"/></TD>
</TR>
</xsl:template>
<xsl:template match="name">
<!-- 4.用于提取节点值 -->
<xsl:value-of/>
</xsl:template>
<xsl:template match="english|math|chymest">
<xsl:choose>
<xsl:when test=".[value()$ge$85]">优秀</xsl:when>
<xsl:when test=".[value()$ge$70]">一般</xsl:when>
<xsl:when test=".[value()$ge$60]">及格</xsl:when>
<xsl:otherwise>不及格</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
XML JavaScript
XMLHttpRequest
XMLHttpRequest对象用于在后台与服务器交换数据,通过该对象,开发者可以
- 在不重新加载页面的情况下更新网页
- 在页面已加载后从服务器请求数据
- 在页面已加载后从服务器接收数据
- 在后台向服务器发送数据
现在的浏览器都支持XMLHttpRequest对象
xmlhttp = new XMLHttpRequest();
//老版本的IE
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
XML解析器
(1)解析XML
所有现代浏览器都有读取和操作XML的内建XML解析器,解析器把XML载入内存,然后把它转换为可通过JavaScript访问的XML DOM对象
(2)解析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;
//其它方法:微软的XML解析器
var xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async="false"; //关闭异步加载,确保在文档完全加载之前解析器不会继续脚本的执行
xmlDoc.load("note.xml");
//其它方法:其它浏览器
var xmlDoc=document.implementation.createDocument("","",null);
xmlDoc.async="false";
xmlDoc.load("note.xml");
(3)解析XML字符串
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";
xmlDoc.loadXML(txt);
}
XML DOM
DOM 把 XML 文档作为树结构来查看。能够通过 DOM 树来访问所有元素。可以修改或删除它们的内容,并创建新的元素。元素,它们的文本,以及它们的属性,都被认为是节点
/*
xmlDoc:由解析器创建的XML文档
getElementsByTagName("to")[0]:第一个<to>元素
childNodes[0]:<to>元素的第一个子元素(文本节点)
nodeValue:节点的值(文本本身)
*/
xmlDoc.getElementsByTagName("to")[0].childNodes[0].nodeValue
而HTML DOM则是通过document.getElementById("to").innerHTML=
则是通过HTML DOM引用来改变id=“to” 的HTML元素的文本
XML to HTML
<html>
<body>
<script type="text/javascript">
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","cd_catalog.xml",false);
xmlhttp.send();
xmlDoc=xmlhttp.responseXML;
document.write("<table border='1'>");
var x=xmlDoc.getElementsByTagName("CD");
for (i=0;i<x.length;i++)
{
document.write("<tr><td>");
document.write(x[i].getElementsByTagName("ARTIST")[0].childNodes[0].nodeValue);
document.write("</td><td>");
document.write(x[i].getElementsByTagName("TITLE")[0].childNodes[0].nodeValue);
document.write("</td></tr>");
}
document.write("</table>");
</script>
</body>
</html>
XML高级
1.XML命名空间(xmlns)
XML命名空间提供避免元素命名冲突的方法,XML中,元素名称都是开发者定义的,当两个不同的文档使用相同的元素名且被放在一起使用时,就会发生命名冲突,XML解析器无法确定如何处理这类冲突
(1).通过使用前缀来避免
<h:table>
<h:tr>
</h:tr>
</h:table>
(2).通过使用命名空间来避免
<h:table xmlns:h="http://www.w3.org/TR/html4/">
<h:tr>
</h:tr>
</h:table>
与仅仅使用前缀不同,我们为<table>
标签添加了一个xmlns
属性,这样就为前缀h
赋予了一个与某个命名空间相关联的限定名称
XML命名空间属性被放置于元素的开始元素之中
<!-- 标识命名空间的地址不会被解析器用于查找信息,其唯一作用就是赋予命名空间一个唯一的名称,许多公司常会用来指向实际存在的网页,这个网页包含命名空间的信息 -->
xmlns:namespace-prefix="namespaceURI"