Xml基础培训4. What is XML?
XML 指可扩展标记语言(Extensible Markup Language)
XML 是一种标记语言,很类似 HTML
XML 的设计宗旨是传输数据,而非显示数据
XML 标签没有被预定义。你需要自行定义标签。
XML 被设计为具有自我描述性。
XML 是 W3C 的标准
5. XML 与 HTML 的主要差异
XML 不是 HTML 的替代。
XML 和 HTML 为不同的目的而设计:
XML 被设计为传输和存储数据,其焦点是数据的内容。
HTML 被设计用来显示数据,其焦点是数据的外观。
HTML 旨在显示信息,而 XML 旨在传输信息。
7. XML 的用途
XML 把数据从 HTML 分离
XML 简化数据共享和数据传输
XML 简化平台的变更
XML 使你的数据更有用
XML 用于创建新的 Internet 语言
XHTML - 最新的 HTML 版本
WSDL - 用于描述可用的 web service
WAP 和 WML - 用于手持设备的标记语言
RSS - 用于 RSS feed 的语言
RDF 和 OWL - 用于描述资源和本体
SMIL - 用于描述针针对 web 的多媒体
8. XML样例
<?xml version="1.0" encoding=“UTF-8" ?>
<cd sernum="99999">
<!-- IMHO, a truly great CD -->
<title>Yankee Hotel Foxtrot</title>
<artist>Wilco</artist>
<cover>
<file path="/covers/yht.gif”/>
</cover>
<track no=“4">War on War</track>
</cd>
9. 基本语法
以XML声明开始
<?xml version="1.0" encoding=“UTF-8"?>
剩余的部分必须包含在根元素(root element)内
<cd sernum="99999"> … </cd>
XML 文档形成一种树结构
元素可以嵌套
元素可以包含子元素和文本,元素可以拥有属性
10. 详细语法规则
所有 XML 元素都须有关闭标签
XML 标签对大小写敏感
XML 必须正确地嵌套
XML 的属性值须加引号
实体引用
拥有特殊意义的字符( "<" 和 "&" )必须用实体引用来代
替
< <
> >
& &
‘ '
“ "
12. XML元素
XML 元素指的是从(且包括)开始标签直到(且包括)结束标签的部分
XML 元素必须遵循以下命名规则:
名称可以含字母、数字以及其他的字符
名称不能以数字或者 标点符号开始
名称不能以字符 “xml”(或者 XML、Xml)开始
名称不能包含空格
最佳命名习惯
使名称具有描述性。使用下划 线的名称也很不错。
名称应当比较简短,比如:<book_title>,而不是:
<the_title_of_the_book>。
避免 "-" 字符。如果您按照 这样的方式进行命名:"first-name",一些软件会认
为你需要提取第一个单词。
避免 "." 字符。如果您按照 这样的方式进行命名:"first.name",一些软件会认
为 "name" 是对象 "first" 的属性。
避免 “:” 字符。冒号会被 转换为命名空间来使用。
14. 子元素 vs. 属性
理论上的差异
子元素是元素的组成部分,属性是元素的额外信息
属性的限制
属性无法包含多个值(子元素可以)
属性无法描述树结构(子元素可以)
属性不易扩展(为未来的变化)
属性难以阅读和维护
作为元数据的 XML 属性
用于标识XML元素的ID
元数据(有关数据的数据)应当存储为属性,而数据本
身应当存储为元素。
18. XML CDATA
所有 XML 文档中的文本均会被解析器解析
只有 CDATA 区段(CDATA section)中的文本会被解析器
忽略。 CDATA 区段开始于 "<![CDATA[",结束于 "]]>”
<script>
<![CDATA[
function matchwo(a,b)
{
if (a < b && a < 0)
CDATA 区段不能包含字符串 "]]
{ >",所以,CDATA 区段的嵌套是不
return 1 被允许的。
}
else
{
return 0
}
}
]]>
</script>
21. XML命名空间
使用前缀来避免命名冲突
<h:table>
<h:tr> <f:table>
<h:td>Apples</h:td> <f:name>Coffee Table</f:name>
<h:td>Bananas</h:td> <f:width>80</f:width>
</h:tr> <f:length>120</f:length>
</h:table> </f:table>
22. XML命名空间
使用命名空间来避免命名冲突
<h:table xmlns:h="http://www.w3.org/TR/html4/">
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>
<f:table xmlns:f="http://www.w3school.com.cn/furniture">
<f:name>Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
与仅仅使用前缀不同,我们为 <table> 标签添加了一个 xmlns 属性,这样就
为前缀赋予了一个与某个命名空间相关联的限定名称。
23. XML Namespace (xmlns) 属性
XML 命名空间属性被放置于某个元素的开始标签之中,
并使用以下的语法:
xmlns:namespace-prefix="namespaceURI"
当一个命名空间被定义在某个元素的开始标签中时,所
有带有相同前缀的子元素都会与同一个命名空间相关
联。
<h:table xmlns:h="http://www.w3.org/TR/html4/">
<f:table xmlns:f="http://www.w3school.com.cn/furniture">
24. 默认的命名空间(Default
Namespaces)
为某个元素定义默认的命名空间可以让我
们省去在所有的子元素中使用前缀的工作
<table xmlns="http://www.w3.org/TR/html4/">
<tr>
<td>Apples</td>
<td>Bananas</td>
</tr>
</table>
<table xmlns="http://www.w3school.com.cn/furniture">
<name>Coffee Table</name>
<width>80</width>
<length>120</length>
</table>
25. 命名空间的实际应用
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-
beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd" >
<bean id=“dataSource” class=“org.springframework.jndi.JndiObjectFactoryBean” > …
</bean>
...
<aop:config>
<aop:advisor
pointcut="execution(* com.bill99.seashell.domain..NotifyService.*(..))” advice-ref="notifyTxAdvice" order="1"/>
<aop:advisor
pointcut="execution(* com.bill99.seashell.domain..*Service.*(..))"
advice-ref="txAdvice" order="2"/>
</aop:config>
<tx:advice id="notifyTxAdvice">
<tx:attributes>
<tx:method name="*" propagation="REQUIRES_NEW" rollback-for="java.lang.Exception" />
</tx:attributes>
</tx:advice>
...
</beans>
27. XML Schema
XML Schema 的作用是定义XML文档的合法构建模
块,是DTD的继任者
定义可出现在文档中的元素
定义可出现在元素中的属性
定义哪个元素是子元素
定义子元素的次序
定义子元素的数目
定义元素是否为空,或者是否可包含文本
定义元素和属性的数据类型
定义元素和属性的默认值以及固定值
28. XML Schema vs. DTD
XML Schema 可针对未来的需求进行扩展
在其他 Schema 中重复使用您的 Schema
创建由标准类型衍生而来的您自己的数据类型
在相同的文档中引用多重的 Schema
XML Schema 基于 XML 编写
XML Schema 支持数据类型
XML Schema 支持命名空间
29. 如何使用 XSD
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:aop="
http://www.springframework.org/schema/aop" xmlns:tx="http://www.
springframework.org/schema/tx" xmlns:xsi="http://www.w3.
org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.
springframework.org/schema/beans http://www.springframework.
org/schema/beans/spring-beans-2.0.xsd http://www.springframework.
org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.
xsd http://www.springframework.org/schema/tx http://www.springframework.
org/schema/tx/spring-tx-2.0.xsd" >
……
</beans>
30. XSD定义:简单元素与属性
<schema> 元素是每一个 XML Schema 的根元素
XSD 简易元素:只包含文本的元素。它不会包含
任何其他的元素或属性
<xs:element name="xxx" type="yyy"/>
XSD 属性:定义属性的语法是: 最常用的类型是:
xs:string
<xs:attribute name="xxx" type="yyy"/> xs:decimal
xs:integer
xs:boolean
xs:date
xs:time
31. XSD 限定 / Facets
对值的限定 限定 描述
定义可接受值的一个列表
enumeration
<xs:element name="age“> 定义所允许的最大的小数位数。必须大
fractionDigits 于等于0。
<xs:simpleType>
<xs:restriction base="xs:integer"> 定义所允许的字符或者列表项目的精确
length 数目。必须大于或等于0。
<xs:minInclusive value="0"/>
<xs:maxInclusive value="120"/> 定义数值的上限。所允许的值必须小于
maxExclusive 此值。
</xs:restriction>
</xs:simpleType> 定义数值的上限。所允许的值必须小于
maxInclusive 或等于此值。
</xs:element>
定义所允许的字符或者列表项目的最大
对一组值的限定 maxLength 数目。必须大于或等于0。
定义数值的下限。所允许的值必需大于
minExclusive 此值。
<xs:element name="car" type="carType"/>
<xs:simpleType name="carType"> 定义数值的下限。所允许的值必需大于
minInclusive 或等于此值。
<xs:restriction base="xs:string">
<xs:enumeration value="Audi"/> 定义所允许的字符或者列表项目的最小
minLength 数目。必须大于或等于0。
<xs:enumeration value="Golf"/>
<xs:enumeration value="BMW"/> pattern 定义可接受的字符的精确序列。
</xs:restriction>
定义所允许的阿拉伯数字的精确位数。
</xs:simpleType> totalDigits 必须大于0。
定义空白字符(换行、回车、空格以及
whiteSpace 制表符)的处理方式。
32. XSD复合元素
空元素
<product prodid="1345" />
包含其他元素的元素
<person>
<firstname>John</firstname>
<lastname>Smith</lastname>
</person>
仅包含文本的元素
<food type="dessert">Ice cream</food>
包含元素和文本的元素
<description> It happened on
<date lang="norwegian">03.03.99</date> ....
</description>
34. XSD复合类型指示器
(Indicators)
Order 指示器:
All
Choice
Sequence
Occurrence 指示器:
maxOccurs
minOccurs
Group 指示器:
元素组
属性组
35. XSD<any>元素
<any>元素使我们有能力通过未被 schema 规定
的元素来拓展 XML 文档!
<xsd:element name="beans">
...
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="description" minOccurs="0"/>
<xsd:choice minOccurs="0" maxOccurs="unbounded">
<xsd:element ref="import"/>
<xsd:element ref="alias"/>
<xsd:element ref="bean"/>
<xsd:any namespace="##other“ processContents="strict“
minOccurs="0" maxOccurs="unbounded"/>
</xsd:choice>
</xsd:sequence>
...
</xsd:complexType>
</xsd:element>
37. XSD 元素替换(Element
Substitution)
通过 XML Schema,一个元素可对另一个元素进行替换
<xs:element name="name" type="xs:string"/>
<xs:element name="navn" substitutionGroup="name"/>
<xs:element name="kunde" substitutionGroup="customer"/>
<customer>
<name>John Smith</name>
</customer>
或类似这样:
<kunde>
<navn>John Smith</navn>
</kunde>
43. JDOM与DOM4J
JDOM
提供友好的Java API,使用SAX2解析器
DOM4J
Dom4j是一个易用的、开源的库,用于XML,XPath
和XSLT。它应用于Java平台,采用了Java集合框
架并完全支持DOM,SAX和JAXP。
47. XSLT介绍
XSLT 是一种用于将 XML 文档转换为 XHTML 文档或其他
XML 文档的语言。
XSLT 指 XSL 转换(XSL Transformations)。
XSLT 是 XSL 中最重要的部分。
XSLT 可将一种 XML 文档转换为另外一种 XML 文档。
XSLT 使用 XPath 在 XML 文档中进行导航。
XPath 是一个 W3C 标准。
几乎所有主要的浏览器均支持 XML 和 XSLT
48. XSLT - 转换
根元素:<xsl:transform>
<xsl:template> 元素
<xsl:value-of>元素 XPath
<xsl:value-of select="catalog/cd/title"/>
<xsl:for-each> 元素
<xsl:sort> 元素
<xsl:if> 元素
<xsl:choose>、<xsl:when>、<xsl:otherwise> 元素
<xsl:apply-templates> 元素
XSLT实例
50. XPath简介
XPath 是一门在 XML 文档中查找信息的语言。XPath 用
于在 XML 文档中通过元素和属性进行导航。
XPath 使用路径表达式在 XML 文档中进行导航
XPath 包含一个标准函数库
XPath 是 XSLT 中的主要元素
XPath 是一个 W3C 标准
51. XPath术语
节点(Node)
元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点
基本值(或称原子值,Atomic value)
基本值是无父或无子的节点
项目(Item)
项目是基本值或者节点
节点关系
父(Parent)
子(Children)
同胞(Sibling)
先辈(Ancestor)
后代(Descendant)
52. XPath语法
表达式 描述
选取节点 nodename 选取此节点的所有子节点
XPath 使用路径表达 / 从根节点选取
式在 XML 文档中选取 //
从匹配选择的当前节点选择文档中的节
点,而不考虑它们的位置
节点。节点是通过沿
. 选取当前节点
着路径或者 step 来 选取当前节点的父节点
..
选取的 @ 选取属性
路径表达式 结果
bookstore 选取 bookstore 元素的所有子节点
选取根元素 bookstore
/bookstore 注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!
bookstore/book 选取所有属于 bookstore 的子元素的 book 元素。
//book 选取所有 book 子元素,而不管它们在文档中的位置。
选择所有属于 bookstore 元素的后代的 book 元素,而不管它们位于 bookstore 之下
bookstore//book 的什么位置。
//@lang 选取所有名为 lang 的属性。
53. XPath语法
谓语(Predicates)
谓语用来查找某个特定的节点或
者包含某个指定的值的节点。
谓语被嵌在方括号中。
路径表达式 结果
/bookstore/book[1] 选取属于 bookstore 子元素的第一个 book 元素。
/bookstore/book[last()] 选取属于 bookstore 子元素的最后一个 book 元素。
/bookstore/book[last()-1] 选取属于 bookstore 子元素的倒数第二个 book 元素。
/bookstore/book[position()<3] 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。
//title[@lang] 选取所有拥有名为 lang 的属性的 title 元素。
//title[@lang='eng'] 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。
选取所有 bookstore 元素的 book 元素,且其中的 price 元素的值须大
/bookstore/book[price>35.00] 于 35.00。
选取所有 bookstore 元素中的 book 元素的 title 元素,且其中的
/bookstore/book[price>35.00]/title price 元素的值须大于 35.00。
54. XPath语法
选取未知节点 通配符 描述
* 匹配任何元素节点
XPath 通配符可用来选取未知的 匹配任何属性节点
@*
XML 元素 node() 匹配任何类型的节点
选取若干路径
路径表达式 结果
通过在路径表达式中使用“|” /bookstore/* 选取 bookstore 元素的所有子节点
运算符,您可以选取若干个路 //* 选取文档中的所有元素
径 //title[@*] 选取所有带有属性的 title 元素。
路径表达式 结果
//book/title | //book/price 选取所有 book 元素的 title 和 price 元素。
//title | //price 选取所有文档中的 title 和 price 元素。
选取所有属于 bookstore 元素的 book 元素的 title
/bookstore/book/title | //price 元素,以及文档中所有的 price 元素。
55. XPath Axes(坐标轴)
XPath 轴
轴可定义某个相对于当前节
点的节点集
轴名称 结果
ancestor 选取当前节点的所有先辈(父、祖父等)
ancestor-or-self 选取当前节点的所有先辈(父、祖父等)以及当前节点本身
attribute 选取当前节点的所有属性
child 选取当前节点的所有子元素。
descendant 选取当前节点的所有后代元素(子、孙等)。
descendant-or-self 选取当前节点的所有后代元素(子、孙等)以及当前节点本身。
following 选取文档中当前节点的结束标签之后的所有节点。
namespace 选取当前节点的所有命名空间节点
parent 选取当前节点的父节点。
preceding 选取文档中当前节点的开始标签之前的所有节点。
preceding-sibling 选取当前节点之前的所有同级节点。
self 选取当前节点。
56. 位置路径表达式
位置路径表达式 例子 结果
绝对位置路径: child::book
选取所有属于当前节点的子元
素的 book 节点
/step/step/...
attribute::lang 选取当前节点的 lang 属性
相对位置路径:
child::* 选取当前节点的所有子元素
step/step/…
attribute::* 选取当前节点的所有属性
步(step)包括:
选取当前节点的所有文本子节
轴(axes) child::text() 点
定义所选节点与当前节点之间的树关系 child::node() 选取当前节点的所有子节点
节点测试(node-test) 选取当前节点的所有 book 后
descendant::book 代
识别某个轴内部的节点 零个或者更多
谓语(predicate) ancestor::book
选择当前节点的所有 book 先
辈
更深入地提 炼所选的节点集
选取当前节点的所有book先辈
步的语法: ancestor-or-self:: 以及当前节点(假如此节点是
book book节点的话)
轴名称::节点测试[谓语]
选取当前节点的所有 price
child::*/child::price 孙。
57. XPath 运算符
运算符 描述 实例 返回值
| 计算两个节点集 //book | //cd 返回所有带有 book 和 ck 元素的节点集
+ 加法 6+4 10
- 减法 6-4 2
* 乘法 6*4 24
div 除法 8 div 4 2
= 等于 price=9.80
!= 不等于 price!=9.80
< 小于 price<9.80
<= 小于或等于 price<=9.80
> 大于 price>9.80
>= 大于或等于 price>=9.80
or 或 price=9.80 or price=9.70
and 与 price>9.00 and price<9.90
mod 计算除法的余数 5 mod 2 1
XPath 实例