实体引用

1
2
3
4
5
# &lt;               <
# &gt; >
# &amp; &
# &apos; '
# &quot; "

CDATA 区

1
2
3
<![CDATA[ 内容 ]]>

<!-- CDATA 区内,不必使用实体--引用,XML解析器不会解析 CDATA 区内的内容 --->

命名空间

xmlns:<name>=<"uri">
<name>:命名空间前缀
<"uri">:命名空间 URI 的字符串
1
2
3
4
<f:table xmlns:f="http://www.w3.org/furniture">
<f:name>African Coffee</f:name>
<f:width>80</f:width>
</f:table>

XML 解析模式

1.流模型 分为:“推”,“拉”两种变体

“推”模型,SAX是事件驱动模型    

2.DOM(文档对象模型)

建立树状结构的方式访问XML文档

区别:
DOM需要加载整个文档和构造层次结构才能工作
DOM内存持久,SAX一次性处理

DOM处理文档编码方便,SAX很难同时访问同一个文档的多处不同数据
.NET 支持 “拉”模式,通过 XMLTextReader 类实现,不支持 SAX

DOM 允许编辑更新XML,可以随机访问文档数据,可以用Xpath查询

XSLT 转换只能输出纯文本文档

位置、步

绝对位置路径:/step/step/…
相对位置路径:step/step/…

步的语法:轴名称::节点测试[谓词]

轴名称:ancestor、ancestor-or-self、attribute、child、descendant、descendant-or-self、following、namespace、parent、preceding、preceding-sibling、self

节点测试:识别某个轴内部的节点

Xml 结构

1
2
3
4
5
6
7
8
9
10
<father lang="en"> Tom Smith
<son> John Smith
<grandson> Hans Smith</grandson>
</son>
<daughter> Jane Smith</daughter>
<son> Jake Smith
<grandson> White Smith</grandson>
</son>
<daughter> Lucky Smith</daughter>
</father>

Xpath 操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

//son/child::node()
#输出
#John Smith
#<grandson> Hans Smith</grandson>
#Jake Smith
#<grandson> White Smith</grandson>

/father/son/text()
//son/text()
//son/child::node()[1]
#输出
#John Smith
#Jake Smith

/father/son/grandson/text()
//son/grandson/text()
//son/child::node()[2]/text()
#输出
#Hans Smith
#White Smith

string(/father/son/grandson)
string(//son/grandson)
string(//son/child::node()[2])
string(//son/child::node()[2]/text())
#输出
#Hans Smith

//son[2]/grandson/text()
(//son/grandson/text())[2]
(son/grandson/text())[2]
#输出
#White Smith

//son/grandson[2]/text()
#无返回

总结:

Xpath 是一种表达式,返回值可以是节点、节点集合、原子值,以及节点和原子值的混合等
节点类型:元素、属性、文本、命名空间、处理指令、注释、根节点
节点关系:父 Parent、子 Children、兄弟 Sibling、先辈 Ancestor、后代 Descendant

Xpath 采用内嵌条件判断语句,解决Xpath路径无法唯一的确认XML节点
Xpath 路径字符串中使用 [] 包含逻辑表达式,谓词被嵌套在方括号中

通配符:* node() @*

Xpath 函数

数值:number、ceiling、floor、round
字符串:string、concat、substring、string-length、normalize-space、translate、contains、starts-with、ends-with、
substring-before、substring-after
上下文:position、last
节点函数:name、local-name
布尔值函数:boolean、not、true、false

其它:测试序列容量的函数、QNames相关的函数、合计函数、生成序列的函数等

XSLT 应用

XSLT 转换过程:

1.创建 XML 文件

1
2
<?xml version="1.0" encoding="iso-8859-1"?>
<item> xml 文件 </item>

2.创建 XSLT 文件

1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/XSL/Transform" version="1.0">

<xsl:template match=pattern name=qname priority=number mode=qname>
<xsl:for-each select="XPath">
<xsl:if test="布尔表达式">
<!-- 执行内容 -->
</xsl:if>
</xsl:for-each>
</xsl:template>

</xsl:stylesheet

3.XML 引用 XSL 文件

1
2
3
4
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- 引用 XSL 文件 -->
<?xml-stylesheet type="text/xsl" href=“xxx.xsl”?>
<item> xml 文件 </item>

XSLT 语法:

<xsl:template>和<xsl:apply-templates>
模板由两部组成:匹配模式和执行

<xsl:template> 定义模板,
<xsl:apply-templates> 用来执行哪一个节点被模板具体处理,可以理解为程序中调用子函数。<xsl:apply-templates> 总是嵌套在 <xsl:template> 元素内

1
2
3
4
5
6
<xsl:template match=Xpath name=qname priority=number mode=qname>
<!-- 执行内容 -->
<xsl:apply-templates select=Xpath set-expression mode=qname>
<!-- 执行内容 -->
</xsl:apply-templates>
</xsl:template>

<xsl:value-of>和<xsl:copy-of> 选取XML元素以及把它添加到已被转换的输出流

1
2
3
<xsl:template match=pattern name=qname priority=number mode=qname>
<xsl:value-of select="name"/>
</xsl:template>

<xsl:for-each> 允许在XSLT里使用循环语句

1
2
3
4
<xsl:template match=pattern name=qname priority=number mode=qname>
<xsl:for-each select="XPath">
</xsl:for-each>
</xsl:template>

<xsl:sort> 节点集合分类,排序

1
2
3
<xsl:template match=pattern name=qname priority=number mode=qname>
<xsl:sort select="XPath获取属性"/>
</xsl:template>

<xsl:if> 条件判断语句

1
2
3
4
5
6
7
<xsl:template match=pattern name=qname priority=number mode=qname>
<xsl:for-each select="XPath">
<xsl:if test="布尔表达式">
<!-- 执行内容 -->
</xsl:if>
</xsl:for-each>
</xsl:template>

<xsl:choose> <xsl:when> <xsl:otherwise> 多条件判断语句

1
2
3
4
5
6
7
<xsl:template match=pattern name=qname priority=number mode=qname>
<xsl:choose>
<xsl:when test="XPath"><!-- 执行内容 --></xsl:when>
<xsl:when test="XPath"><!-- 执行内容 --></xsl:when>
<xsl:otherwise><!-- 执行内容 --></xsl:otherwise>
</xsl:choose>
</xsl:template>

.NET XslCompiledTransform 类,命名空间 System.Xml.Xsl,接受 XML 数据并将其转换成多种形式

XSLT 传递参数:

XSLT 文件中定义参数变量,能够接受外部传入的具体值。.NET XsltArgumentList 类可以获得这些值集合

1
2
3
4
5
6
7
8
9
<!-- 定义参数变量 -->
<xsl:param name="paramname">
<xsl:template match=pattern name=qname priority=number mode=qname>
<xsl:for-each select="XPath">
<xsl:if test="Xpath[text()=$paramname]">
<!-- 执行内容 -->
</xsl:if>
</xsl:for-each>
</xsl:template>

应用扩展对象:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<!-- 定义 命名空间 mObj-->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/XSL/Transform" version="1.0" xmlns:mObj="urn:price-conv">
<!-- 定义 变量 conv-->
<xsl:param name="conv" select="1.529">

<!-- 添加新项目 NewPrice-->
<conv-price>
<xsl:value-of select="mObj:NewPriceFunc(./price, $conv)"/>
</conv-price>

<!-- c# 代码 -->
<!--
XslCompiledTransform 实例对象 _xslt
调用 Load() 加载 XSLT 样式表文件
定义 BookPrice 类
BookPrice 实例对象 _obj
XsltArgumentList 实例对象 _argum
调用 AddExtensionObject(URL,Obj) 方法
命名空间 URL:“urn:price-conv”
Obj 对象:“BookPrice 实例对象 _obj”

mObj:NewPriceFunc -> BookPrice 类中定义的 NewPriceFunc 函数,通过 _obj 对象在 XSLT 中被调用
-->

XML 验证

XML 目的:存储和交换数据
XML 验证目的:保证所有的 XML 文档结构一致
两种方法:DTD模式、XML Schema

区别:

DTD基于正则,描述能力不够;没有数据类型的支持;约束定义能力不足,无法对 XML 文档作出更细致的语义限制;结构不够结构化;没有标准的编程接口
XML Schema基于XML,支持数据类型,可扩展的数据模型,支持综合命名空间,属性组

XML 应用 DTD:
    内部 DTD、外部 DTD:<!DOCTYPE customers SYSTEM "Customers.dtd">

XML 应用 XSD Schema:
    XML 根元素 包含 xmlns:xsi,xsi:(schemaLocation|nonamespaceschemaLocation    )
    XSD 声明中添加 targetNamespace 指定目标名字空间

XML Schema 创建:
    编辑文本方式、VStudio 设计器、模式对象模型(SOM),编程方式

XML Schema 文档:

1
2
3
4
5
6
7
8
9
<!-- XML Schema 文档 -->
<xs:schema xmlns:xs="http://www.w3.org/XMLSchema">
<xs:element name="quantity" type="xs:nonNegativeInteger"/>
</xs:schema>

<!--
quantity:元素
nonNegativeInteger:类型
-->

XSD 文档至少包含:schema 根元素(唯一)和XML模式命名空间的定义、元素定义

1
2
3
4
5
6
<!-- schema 根元素 -->
<xsd:schema xmlns:xsd="http://www.w3.org/XMLSchema">
<!-- 元素 -->
<xsd:element name="user" type="xsd:string" minOccurs="元素在父元素中出现的最少次数,默认1,值范围>=0"
maxOccurs="出现的最多次数,unbounded:次数不限制" default="默认值" fixed="固定值"/>
</xsd:schema>

应用元素、替代、组合器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<!-- schema 根元素 -->
<xsd:schema xmlns:xsd="http://www.w3.org/XMLSchema">
<!-- 元素别名 -->
<xsd:element name="yonghu" type="xsd:string" substitutionGroup="user"/>
<xsd:element name="user" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>

<xsd:element name="name">
<xsd:complexType>
<!-- sequence组合器:定义一列元素必须按照模式中制定的顺序显示 -->
<xsd:sequence>
<xsd:element ref="user"/>
<xsd:element ref="address"/>
</xsd:sequence>

<!-- all组合器:允许一列元素任意顺序显示,all 元素的子元素默认情况必须,且最多显示一次 -->
<xsd:all minOccurs="0">
<xsd:element ref="user"/>
<xsd:element ref="address"/>
</xsd:all>

<!-- choice组合器:允许一列元素中的一个,用于互斥 -->
<xsd:choice>
<xsd:element ref="user"/>
<xsd:element ref="address"/>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>

属性:default、fixed、name、ref、type、use、form、id

<xsd:attribute name="age" type="xsd:integer"/>

xsd:attribute 必须是 schema、complexType、attributeGroup 元素的子元素,要把属性添加到元素上,属性应该在 complexType 定义的组合器后定义或应用

Schema 数据类型:

约束:
    enumeration、fractionDigit、length、(min|max)(Exclusive|Length|Inclusive)、pattern、totalDigits、whiteSpace
简单类型:
    simpleType 不能包含元素、属性,只能是值、值得集合
列表类型:
    list
联合类型:
    union    
复杂类型:
    complexType    

内容模型:
    any empty mixed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!-- 定义 simpleType 简单类型 -->
<xsd:simpleType id="唯一标识" name="USState">
<!-- resteriction 应用约束 -->
<xsd:resteriction id="唯一标识" base="xsd:string">
<xsd:enumeration value="AK"/>
<xsd:enumeration value="AL"/>
</xsd:resteriction>
</xsd:simpleType>

<xsd:simpleType id="唯一标识" name="ListOfIntType">
<!-- 定义列表 -->
<xsd:list itemType="Integer"/>
</xsd:simpleType>

<xsd:simpleType id="唯一标识" name="ZipUnion">
<!-- 定义联合类型 -->
<xsd:union memberTypes="USState ListOfIntType"/>
</xsd:simpleType>

XMLReader 类验证 XML
XMLDocument 类验证 XML
XPath 导航器验证 XML
验证未声明 XSD Schema 模式文件位置的 XML
ValidationEventHandler 事件实例 -关联-> 处理函数 ValidationEventHandler() -> XmlDocument类 -> Validate()