XML语法基础

 花了几天时间总结一下XML,总结完后发现这个文档很长,于是一分为三:XML语法基础,XML的解析,XML与数据库的交互,这是第一部分。。。。

  XML (eXtensible Markup Language,可扩展标记语言)可以定义自己的一组标签,使人们或程序能够理解这些标签.
  XML包含以下几部分:

  例如:
 <?xml version='1.0' encoding="gb2312"?> ★①
    <!DOCTYPE ★②
          CUSTOMER[    
          <!ENTITY FIRSTFLOOR "唐宁街 15 号 1 楼"> ★③
          <!ENTITY SECONDFLOOR "唐宁街 15 号 2 楼">
          ]
    > 
                                              
      <CUSTOMERS> ★④
           <CUSTOMER>
             <NAME> 成龙 </NAME>
             <ADDRESS> &FIRSTFLOOR; </ADDRESS>
             <PHONE>5715746</PHONE>
           </CUSTOMER>
    <CUSTOMER>
      <NAME>阿诺德</NAME>
      <ADDRESS>&SECONDFLOOR;</ADDRESS>
      <PHONE>6865863</PHONE>
    </CUSTOMER>
     </CUSTOMERS>

====================================================

  说明:
  ★①XML声明 :
     这里声明的XML版本为1.0,编码格式为 "gb2312"

  ★②XML文档类型定义
     <!DOCTYPE >类似于关键字,这里是对CUSTOMER节点定义文档类型,定义好的类型,只能在CUSTOMER节点中使用,否则会报错。
     注意,XML严格区分大小写,所以DOCTYPE不能写错了。

  ★③XML实体定义
     <!ENTITY>也是关键字,在一对[]中可以定义实体,就像是键值对的定义,前面是键值,后面是对应的值,这样可以在下面的文档中
     通过键值引用具体的值。

  ★④XML文档元素
     通过一对标签可以把具体的值存储在文档中,要存储上面定义好的实体需要 &符号,然后引用实体的键值,并以;号结束。
     例如这里的&FIRSTFLOOR;,其实存储的是上面定义好的"唐宁街 15 号 1 楼"。

 


现在看一下,通过dtd文件来定义XML

   例如:
  
   == Example 3.xml ==
   <?xml version = "1.0" encoding="gb2312"?>
   <!DOCTYPE book SYSTEM "Example3.dtd">  ★①
     <book>
 <details>
     <name>xml 使用详解</name>
     <author>成龙来自&country;</author>
     <publication>Mac &rights;</publication>
     <price>&pricenotation;50</price>
 </details>
 <details>
     <name>xml 揭密</name>
     <author>Raghu 来自&count;</author>
     <publication>Mac &rights;</publication>
     <price>&pricenotation;45</price>
 </details>
     </book>

 

   == Example3.dtd ==

   <?xml version = "1.0" encoding="gb2312"?>
   <!ELEMENT book (details+)>  ★②
   <!ELEMENT details ( name, author, publication, price)>  ★③
   <!ELEMENT name (#PCDATA)>  ★④
   <!ELEMENT author (#PCDATA)>
   <!ELEMENT publication (#PCDATA)>
   <!ELEMENT price (#PCDATA)>
   <!ENTITY country "中国"> ★⑤
   <!ENTITY count "印度">
   <!ENTITY rights "版权所有">
   <!ENTITY pricenotation "$">

====================================================

  说明:
  ★①
      这里仍然是XML文档类型定义,只是在定义的时候用的是外部的dtd文件。这里就得严格的按照dtd定义的格式来书写XML。
      SYSTEM就是导入外部的dtd文件。
  ★②
      这里定义了一个根节点 "book" 他的子节点为 "details",这里的+号表示可以有多个子节点。如果去掉这个+号,表示子节点就只能有
      一个,否则就会报错。
  ★③
      这里是为details节点定义下级节点,分别为:name, author, publication, price
  ★④
      这里是为子节点定义具体的类型,可以有两种定义,一种是#PCDATA,表示是要被解析器解析的,一般的定义都是#PCDATA。另一种是
      #CDATA,在CDATA内部的所有内容都会被解析器忽略。CDATA全称character data,翻译为字符数据。我们在写XML文档时,
      有时需要显示字母,数字和其它的符号本身,比如"<",而在XML中,这些字符已经有特殊的含义,我们怎么办呢?
      这就需要用到CDATA语法。语法格式如下: <![CDATA[这里放置需要显示的字符]]>
      例如:
        <![CDATA[<AUTHOR sex="female">ajie</AUTHOR>]]>
        在页面上显示的内容将是"<AUTHOR sex="female">ajie</AUTHOR>"
  ★⑤
      这里就很熟悉了,就是在定义实体,和上面的用法是一样的。

 

 

现在来看一下怎样通过dtd文件来定义XML的属性

<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE movies
[ ★①
<!ELEMENT movies (movie+)>
<!ELEMENT movie (title?,actor+,rating*)>★②
<!ELEMENT title (#PCDATA)>
<!ELEMENT actor (#PCDATA)>
<!ELEMENT rating (#PCDATA)>
<!ATTLIST movie type CDATA #IMPLIED> ★③
]
>
<movies>
        <movie type="冒险片">
     <title> 空中监狱 </title>
     <actor> 尼古拉斯 凯奇</actor>
     <rating>家长指引</rating>
 </movie>
 <movie type="恐怖片">
     <title> 幽灵 </title>
     <actor> 黛米 摩尔</actor>
     <actor> 帕特里克 斯韦兹</actor>
     <rating>家长指引</rating>
 </movie>
</movies>

====================================================

  说明:
    ★①
      这里是内嵌的dtd文件,和外部的dtd文件没有任何区别
    ★②
      注意 "actor+" 这里表示actor节点可以有多个,"title?"表示title节点只可使用一次或者不使用,"rating*"rating节点可以
      表示使用一次,多次,或者根本不使用。
    ★③
      这里是重点,<!ATTLIST>就是给节点配置属性的,这里是给 "movie"节点配置属性叫 "type","#REQUIRED"表示此属性是不可省略的,
      必须要有,否则就报错了,"#IMPLIED"表示的正好相反,表示可以省略。

 

 

再来看看dtd文件文件中定义元素时的变量的运用

== Example6.dtd ==

<?xml version="1.0" encoding="gb2312" ?>
<!ENTITY % p "a">  ★①
<!ELEMENT roster ((%p;)+)> ★②
<!ELEMENT %p; (name,sex,birthday,score?,skill+)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ELEMENT birthday (#PCDATA)>
<!ELEMENT score (#PCDATA)>
<!ELEMENT skill (#PCDATA)>
<!ATTLIST %p; sign ID #REQUIRED>  ★③


== teacher.xml ==

<?xml version="1.0" encoding="gb2312" ?>
<!DOCTYPE roster SYSTEM "Example6.dtd" [
<!ENTITY % p "teacher">  ★④
]>
<roster>
 <teacher sign="t101">
  <name>张老师</name>
  <sex>女</sex>
  <birthday>1968.3.1</birthday>
  <skill>Java</skill>
  <skill>Oracle</skill>
  <skill>C Sharp</skill>
  <skill>SQL Server</skill>
 </teacher>
</roster>


== student.xml ==

<?xml version="1.0" encoding="gb2312" ?>
<!DOCTYPE roster SYSTEM "Example6.dtd" [
<!ENTITY % p "student">  ★⑤
]>
<roster>
 <student sign="s101">
  <name>李华</name>
  <sex>男</sex>
  <birthday>1978.9.12</birthday>
  <score>98</score>
  <skill>Java</skill>
  <skill>Oracle</skill>
  <skill>C Sharp</skill>
  <skill>SQL Server</skill>
 </student>
</roster>

====================================================

  说明:
    ★①
       这里定义了实体,和普通的定义实体没什么不同,区别在于这里定义的是个变量,"% p"是变量名,"a"是默认值。
    ★②
       给根节点"roster" 定义子节点,这里用到了变量,注意引用变量的格式:  " %p; ",一定要以;号结束。
    ★③
       给变量节点定义属性,这里的属性名是sign,属性的类型是ID型,表示sign的值不能重复,#REQUIRED表示不可缺省。
       这里要说一下属性的类型:
       一般有三种常用的类型。
       第一个是ID。它要求属性的值在文档中不重复。使用过数据库的人都知道唯一标志符的必要性。DTD ATTLIST语句看起来象这样:
       <!ATTLIST element_name attribute_name ID #REQUIRED>
       很难想象没有#REQUIRED缺省值的ID属性类型。如果那样,任何重复的或空的ID都会迫使处理器返回一个错误。
       ID必须以字母或下划线开始并且不能包含任何空格。
       NMTOKEN类型也使用上面的命名规则。但是允许重复。它被用做传递数据给应用程序的保障。大多数程序语言,
       包括Java和JavaScript,在模块名中不能有空格。大多数情况下,最好保证属性符合它们的规则。
       最后是枚举类型,不需要特定的关键字。而是用"|"符号包含在括号内的值,例如:
       <!ATTLIST sibling (brother | sister) #REQUIRED>
    ★④
       这是在XML中,用具体的节点将dtd文件文件中定义节点变量替换掉。
    ★⑤
       这里的作用与上面是一样的,这样的好处是多个XML可以对应一个dtd文件,但前提是这些XML的格式与结构是一样的。

 

 

现在来看一下XML的命名空间
    XML文档可以创建自定义的元素和属性词汇来描述数据。当XML文档较为复杂或是需要从别的地方取得内容时,
    一个文档中有可能会需要不止一个词汇,这样就会产生名称相同而含义不同的元素出现在不同词汇中的情况,这时候就需要导入命名空间。
    XML 命名空间提供了一个通过与由 URI 引用确定的命名空间相联系的简单方法来保证在XML文档中的元素和属性名字的合法性。
    命名空间可以指明哪个元素属于哪个词汇。它可以为每个词汇指定唯一的前缀进行识别,再将该前缀应用于XML文档中的元素上。
   
<?xml version=“1.0” encoding=“gb2312” ?>
  <sample xmlns:ins="http://www.Aptech_edu.org" xmlns:="http://www.tea.org"> ★①
       <ins:batch-list> 
          <ins:batch>夜班培训批次</ins:batch>★②
          <ins:batch>早班培训批次</ins:batch>
          <ins:batch>午班培训批次</ins:batch>
          <ins:batch>
             第一批茶
             <tea:batch> ★③
                批号 333
             </tea:batch>
          </ins:batch>
          <ins:batch>
             第二批茶
             <tea:batch>
                批号 222
             </tea:batch>
          </ins:batch>
       </ins:batch-list>
  </sample>

====================================================

  说明: 
   ★①
     这里在根节点里面通过 "xmlns:"关键字引入命名空间,应用名为ins,另一个引用名为tea,那么在下面的文档中就可以通过引用名来
     区分batch了。
   ★②
     这里是对"http://www.Aptech_edu.org"命名空间的batch进行引用
   ★③
     这里是对"http://www.tea.org"命名空间的batch进行引用

   值得注意的是,URI并不一定需要指向一个实际的文档或目录。对它仅有的要求就是,在XML文档中它必须是唯一的。
   然而很多处理程序,包括XML模式、XHTML和XSLT处理程序,都使用URI来注明它们必须处理文档的某一部分。
   因此,对于这些应用程序需要使用正确的URI。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值