XML&DTD

XML:Extensible Markup Language, 可扩展标记语言

 

特点:

比起html, html是显示/样式与数据不分离,

xml只显示纯数据,和样式无关.

 

Html的标签,  a,br, p,div,span等等

Html的标签是固定的xml的标签呢,是自定义的. (自描述性)

往往定义的时候,是要体现内容的一个简单描述,

因此,我们说XML具有自描述性.

 

 

哪些场合容易见到XML?

交换数据或传输数据时

比如公共查询接口,例如 豆瓣的书评查询, google的天气查询

 

或者存储数据时可以当做小型数据库用[在线词典]

 

用来做配置文件


XML的语法规范

1:基本的XML可以分成3部分

文档声明[可选,但是强烈建议加上,并设置编码为utf-8]

  例: <?xml version="1.0" encoding="utf-8"?>,  version只能选1.0

DTD声明[可选]

根结点:最顶层的元素,包含其他所有元素/结点的根结点.

根结点必须有且只能有一个.

 

1.1 元素的语法规范

   标签必须闭合

   标签不允许相互嵌套

   标签名称区分大小写

   单标签的闭合

1.2 属性的语法规范

   属性必有值

   属性值必用引号包起来

1.3 特殊字符与实体

   在XMLxhtml,对于实体的概念是一样的,

对于 &,>,< ',"要用实体来代替,  & > < " '

 

1.4 注释的语法

   注释写在 <!-- 注释写在这里-->

   注释内部不要出现 --

   注释不能嵌套

   注释可以除了标记以内的任何地方写

 

1.5 CDATA,  character data的缩写,一大段字符数据

对于CDATA,原样输出,不用实体代替.

 

 

 

DTD用法

document type definition: 文档类型定义

节点下面可以子节点,子节点又可以有子节点,子节点的名称可能无限种可能.

能否对XML的节点的名称,个数,类型等做一个限制?

:可以,DTD就是用来规范节点的名称,个数,类型.

可以理解XML文档的"说明书".

XML文档的结构必须符合此说明书

 

XML是一种通用的规范,只要满足该规范都能够来解析XML文档,

Javascript, ActionScript,PHP,java,都有解析XML的功能或库.

Ff, IE也能来解析XML,但是用的不相同的引擎.

 

IE来帮我们进行XML的解析和测试


DTD可以用来规范XML的元素,属性实体

2.0: DTD的基本写法

<!DOCTYPE 根节点名称 [

]>

 

2.1 DTD如何规范XML的元素?

:

<!ELEMENT 结点名称 结点规范> ,结点规范的4种形式,见下:

规范形式1:    (子节点1,子节点2,子节点3....子节点N) ,规范的是子节点的名称

规范形式2:    (#PCDATA)

规范形式3:    EMPTY

规范形式4     ANY, 如果是ANY,则结点可以是空结点,可以文本结点,也可以是多层子节点,但是,如果是多层子节点,依然是要对子节点做说明.

               

2.2 DTD如何规范属性

属性名="属性值"

该属性是否必须有是否唯一是否只能选某几个可能值之一?  是否有默认值?

<!ATTLIST 元素名称

属性1名称  属性类型 属性特点

属性2名称  属性类型 属性特点

>

属性类型:

ID  ----> 如果属性为ID类型,则属性的值 必须唯一

IDREF/IDREFS ---> 这个属性的值必是文档内某个ID属性的值

CDATA(文本)

Enumerated(枚举类型)

 

属性特点 ------------------------------>典型写法

#REQUIRED : 要求属性必须有 -->#REQUIRED 

#IMPLIED  :  属性可有可没有 ---> #IMPLIED

#FIXED    : 属性值是固定的  ---> #FIXED "固定值"

Default_value : 默认值         ------> "默认值"

 

 

属性类型 ----------------------------->典型写法

ID  :要求该属性值必须是唯一的--------> ID

CDATA: 属性值为普通字符串 ----------> CDATA

IDREF: 属性值必为ID类型属性的一个值----> IDREF

IDREFS:属性是ID类型属性的一个,或多个值----> IDREFS, 多个值用空格隔开

Enumerated: 属性的值改为以下几个之一, ----------> (1|2|3|N)


2.3 DTD规范XML的实体

1实体声明  

<!ENTITY 实体名 "实体值">

2: 引用实体

&实体名;

 

2.4 在对元素的声明中修饰符的作用

()   包在子元素外面,把子元素合成组

夹在子元素名称之间,限制子元素的顺序

+ ,是修饰元素的"个数"用的, + 代表 1->N,

*, 是修改元素个数代表 0->N

?, 是修饰元素个数代表01

|, A|B|C ,A,B,C任取一个

 

3. 如何生成和解析XML

通过PHPDOM操作来生成和解析XML

 

3.1  , 如何实例化DOM操作类

: $dom = new DOMDocument(1.0,'utf-8');

 

3.2 如何载入XML文档

: $dom->load('xml-path');

 

3.3: 如果查询节点?

   3.3.1 根据id来查询具体节点, (要求DTD中已声明为ID的属性)

   例: $dom->getElementById('ID');

 

   3.3.2 根据已查到的节点,查其子节点返回的是"列表对象"

$node->childNodes 属性就可读到

 

   3.3.3 根据标签名 来查询节点列表返回值是一个"列表对象"

   $dom->getElementsByTagName('标签名');

 

   3.3.4 根据节点列表对象,查询列表中的任意一个子节点.

$list->length 属性可以读出子节点的数量来

$list->item(index), 读取列表中第index个节点来

 

   3.3.5 查到节点后,又如何读取节点的值

      $node->nodeValue就可以

   3.3.6 查到节点后,又如何读取属性的值

      $node->getAttribute(属性名) ;// 读到属性的值


3.4 PHPDOM创建XML

3.4.1 创建节点

$xmldom->createElement('节点名'[,节点的文本内容]),

 

:->createElement('app','内容'); ---> <app>内容</app>

->crateELement('app') ---->  <app></app>


3.4.2 : 如何创建属性节点?

$node->setAttribute('属性名','属性值');

 

3.4.3 如何创建CDATA

$dom->createCDATASection('内容');

 

 

3.4.4: 如何添加子节点

$node->appendChild(子节点);

 

 

3.5 如何删除子节点

父节点->removeChild(子节点)

 

3.6: 如何修改子节点

父节点->replaceChild(新子节点,旧子节点)

 

 

 

XPATH, Xquery

宇宙霹雳无敌光速查询技术  xpath

XPATH, 的基本写法

从根节点通过节点的层次来定位.

1逐层定位

/cetsix/word/name -->找根节点下->word->所有name节点注意节点层次必须紧挨着.

 

2: 任意层次定位

//name  , 找任意层次的,name节点

 

// 用条件查询按属性作条件

/cetsix/word[@name="value"], cetsix下的word,并且wordname属性的值是'value'

: <word name="value"></word>

 

// 用条件查询按子元素的值做条件

/cetsix/word[name="value"], cetsix下的word,并且wordname子元素的值是'value'

: <word ><name>value</name></word>

 

 


讨论

<book id="boo1">

</book>

 

<book>

   <id>b001</id>

</book>

 

什么时间用属性什么时间用元素?

 

商品表为例:

商品名商品价格库存--->这些信息商品固有的信息.

每一行商品,又加了"id"信息

 

这个id信息,原本没有因为商品信息太多,为管理/区别商品的固有信息,另加的id.

 

这个id, '关于信息的信息', ---> "元信息"

 

一般而言,元信息,适合用属性,实体信息适合用子元素,

 


你可能感兴趣的:(xml,dtd)