XML笔记一
XML是描述和结构化数据的技术。
二进制文件的好处是快,但是不同的软件用不同的格式(就是描述信息的信息,meta. data)。
文本文件, 8bit合在一起做为一个unit来表示一个字符。 好处是易读,不好处是加入meta. data很难。 比如doc存成txt,会失去很多格式。
Markup language 就是自我描述的text , 从SGML开始,后来有了HTML。XML也是SGML的子集
XML其实不是一种真正意义上的语言,而是创造你自己语言的一种规则和标准。
<name>
<first> John </first>
<last> Doe </last>
</name>
XML可以用style. sheet 语言来规范显示,比如XSLT或者CSS, 原始XML在IE中可以显示。
为什么要用XML?
数据多样性使得自己制定规则很复杂,或者常常是写程序的时候限制数据, 而XML则可以很灵活处理任何数据。
比如这个人要加一个middle name
<name>
<first> John </first>
<middle> Fitzgerald Johansen </middle>
<last> Doe </last>
</name>
XML Parser是指解开XML语法,得到数据的程序。
XML也是group info in hierarchies. 好像JS的DOM一样。
XML的应用
Website Content, Distributed Computing, e-Commerce
XML基础
tree structure, tags, element, attribute
XML rule: tag必须成双,不能overlap, element必须嵌套nested,一个XML文档只有一个根,case sensitive, XML naming conventions. 在PCDATA上保持whitespace而不stripping(html会strip)
XML 注释 <!-- -->
empty elment like this: <middle />
XML Declaration: version, encoding, standalone(yes: 只靠自己存在,no: 也依靠外部DTD)
XML Pi: Processing Instructions <? ?>
escaping Characters: & &
< <
> >
' '
" "
XML Namespaces 是一个vocabulary,或者说a group of names。 因为不同的作者可能用一样的词表示不一样的意思。
而用来标识Namespaces的URL只是一个名字,并不是真正的location.
做为一个属性出现 xmlns: pers="http://www.wiley.com/pers"
xmlns: html="http://www.w3.org/1999/xhtml"
而 pers做为 前缀出现在XML中。 而也可以定义一个默认的Namespace, 而不带前缀的tag都表示在它之内。
而Namespace定义也不一定要在root上面,还可以在任何地方,甚至可以给某个tag定义他自己以及他下面的Descendants的不同于整个XML默认Namespace的Namespace
比如
<person xmlns="http://www.wiley.com/pers">
<!-- 默认的Namespace -->
<name />
<!-- 没有前缀,表示默认Namespace -->
<p xmlns="http://www.w3.org/1999/xhtml"> This is XHMTL</p>
<!-- p和它所有子结点的默认Namespace换了,这里p也没有用前缀 -->
</person>
Namespaces & attributes attribute并不跟谁element处在同一namespace中,而是在整个xml的默认的namespace中,除非你用前缀显式定义它在某个namespace里面。
DTD Document Type Definitions
是用parsers来验证XML是否符合某种Vocabulary的规则。
<?xml version="1.0" ?>
<!DOCTYPE name [
<!ELEMENT name (first, middle, last)>
<!ELEMENT first (#PCDATA)>
<!ELEMENT middle (#PCDATA)>
<!ELEMENT last (#PCDATA)>
]>
<name>
<first> John </first>
<middle> Fitzgerald Johansen </middle>
<last> Doe </last>
</name>
DTD的定义是有点像SGML的,也一定要放在开头。
SYSTEM 和 PUBLIC 标识
<!DOCTYPE name SYSTEM "http://wiley.com/hr/name.dtd" []>
<!DOCTYPE name SYSTEM "file:///c:/name.dtd" []>
<!DOCTYPE name PUBLIC "-//Beginning XML//DTD Name Example//EN">
<!DOCTYPE name PUBLIC "-//Beginning XML//DTD Name Example//EN" "name.dtd">
对于不同的工业科技领域,有一些公认共享的DTD,可以引用。比如化学的 CML DTD
DTD通常是三个部分 Elment 声明 sequence or choice
Attribute声明 属性类型
Entity 声明 Built-in, Character, General, Parameter
<!ELEMENT contacts (contact*)>
<!ATTLIST contacts source CDATA #IMPLIED>
DTD比XSD的优势 有Entity 声明, 是直接嵌入在XML Recommendation里面的
XML Schemas(XSD)
也是用来描述XML文档结构的。
XSD比DTD的优势 和XML一致的语法,提供Namespace support(DTD只能通过属性定义),很好的Data Types, Object继承和Content模型继承。
name.xml
<?xml version="1.0" ?>
<name xmlns="http://www.example.com/name"
<!-- 默认namespace , 和xsd里面 targeNamespace一致 -->
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.com/name name.xsd"
<!-- XMLschema和location 对 -->
title="Mr.">
<first> John </first>
<middle> Fitzgerald Johansen </middle>
<last> Doe </last>
</name>
xsd存在外部的.xsd文件中
name.xsd
<?xml version="1.0" ?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:target="http://www.example.com/name"
targetNamespace="http://www.example.com/name" elementFormDefault="qualified">
<element name="name">
<!-- 是Global Type -->
<complexType>
<sequence>
<element name="first" type="String"/>
<element name="middle" type="String"/>
<element name="last" type="String"/>
<!-- 类型是字符串,也是Local Type -->
</sequence>
<!-- 这里是一个sequence,序列 -->
<attribute name="title" type="String"/>
</complexType>
</element>
</schema>
Global Type是定义在schema直接的子结点上的, 而其他的地方定义的都是Local Type
complexType and simpleType
<group>
Content Models
<sequence>
<choice>
<group>
<all>
minOccurs, maxOccurs
TAG: