java系统学习(十五) --------xml基础

来源:互联网 发布:怎么缴费过期域名 编辑:程序博客网 时间:2024/06/07 05:50


XML的产生及于HTML的比较

  

  XML的产生

  XML的全称是"Extensible Markup Language",是可扩展的标记语言。为什么说它是可扩展的?它又扩展谁?其实它由标准通用标记语言(Standard Generalized Markup Language,SGML)扩展而来的,XML是SGML的简化版本。
    SGML功能非常强大,可以定义标记语言的元语言。由于它非常复杂,不适合在Web上应用,所以将其扩展为在互联网上应用的XML语言。
    HTML是一种标记语言,在HTML里面有很多标记,而XML允许创建自己的标记。XML并不是标记语言,它是用来创建标记语言的元语言。XML不是HTML的替代品,也不是HTML的升级,它只是HTML的补充,为HTML扩展更多的功能。
    XML用来定义类似HTML的标记语言,然后再用这个标记来显示信息。那么XML有什么优点呢?
    现在网络应用越来越广泛,仅靠HTML单一的文件类型,处理千变万化的文档和数据已经力不从心。HTML的语法十分不严谨,而XML作为Web 2.0必需的数据传输和交互工具,其语法非常严谨。XML使得在网络上使用SGML语言变得更加简单和直接。



XML与HTML的比较

HTML


<html>       <head>          <!--设置标题-->          <tit1e>静夜思</title>      </head>      <body>            <!--输出标题文字-->       <h2)      <Font size=3 Color="read">静夜思</Font>       </h2>      <!--输出普通文字--><b>作者:李白</b><br><hr Color="blue"><!--输出段落文字--><p>        <b><i>                      <Font size=3  Color="green">                        床前明月光,疑是地上霜。                                <br>                        举头望明月,低头思故乡。                    </Font>              </i>        </b>      </body></html>


XML

<?xml version="1.0" encoding="gb2312"?><人物>      令狐冲    <!--这是一个令无数少女为之倾倒的偶像-->      <籍贯>华山</籍贯>      <性别>男</性别>      <年龄>24</年龄></人物>


通过上面两个实例可以看出,HTML必须按照规定的标签书写,不能够自己创造。而XML中可以自己创造标签。


XML文档

    XML文档由实体(存储单元)组成,用来定义标签的标记语言,可用来定义自己所需要的标签集。HTML只支持英文标签,而XML可以支持多种语言的标签。
    现在把整个文档进行划分,可以看出一个文档(包括HTML文档)总共分为3个部分,也可以说是3大要素,即文档数据、文档结构、文档样式。
    下面以HTML为例分析文档的3要素。

<table border=2 align=center>    //文档样式  <caption>清华大学菜价表</caption>    <tr>      <td align=center>鱼香肉丝</td>    <td align=center>3.50</td>   //文档数据    </tr></table> //文档结构
   为了能够让XML的文档具有可读性,XML文档采取了数据与文档样式分离的原则。XML文档只提供数据,而XSL包括数据样式,文档的结构则使用DTD。

XML的声明

在一个完整的XML文档中必须包含一个XML文档声明,该声明必须位于文档的第一行。
这个声明表示该文档是一个XML文档,以及遵循的是哪个XML版本的规范。那么如何进行声明呢?声明的语法如下:

  

  <?xml 版本信息 (编码信息) (文档独立性信息) ?>

    分别解释每个元素的含义。
    口版本信息:是指XML目前使用的是1.0版还是1.l版,一般用1.0版本。
    口编码信息:就是指定文档使用的是何种编码格式。如果使用中文编码格式,则可用"encoding='gb2312'"};如果不设定编码信息、,默认使用英文编码格式。
    口文档独立性信息:文档独立指当前文档是否依赖外部文档。如果依赖可以通过下列方式
      表示:"standalone= 'yes'":如果不独立,将通过下列方式表示:"standalone= 'no'"
    根据以上面的介绍,下面举一个实例演示XML文档的声明。

<?xm1 version=1.0   encoding="gb2312"  standalone="yes"?>


文档类型的声明

    在介绍文档类型声明时,涉及一个概念:DTD。所谓DTD ,就是一种保证XML文档格式正确的有效方法,可以通过校验XML文档内容来验证其是否符合规范,元素和标签使用是否正确,这就是DTD的作用。
    文档类型的声明共有两种:
    口在其他文件中定义文档类型。

<!DocTYPE MYDOC SYSTEM "mydoc .dtd">
    此句指出该文档类型名为MYDOC,这时如果对文档结构不是很清楚,必须要查询"mydoc.dtd”文档才能知道。
    口在XML文档中直接定义文档类型。

<!DocTYPE BIRDS [<!ELEMENT AUCTIONBLOCK(ITEM,BIRDS)>]>
上述代码像前面的实例一样,直接在XML文档中定义文档结构。


元素


与HTML一样,XML文档的主体内容部分也是由元素构成的,一个XML元素由一个标记来定义。为了让读者能更好地掌握元素,在讲述每个元素内容时,都会配有相应实例。

 非空元素构成

    元素=起始标签+元素内容+结束标签,代码如下所示。
 
   <BID ID=200138>        <PRICE>60000</PRICE>        <TIME>3:00:00</TIME>     </B工D>



 字符数据段

这段字符数据只是出现在文档内部,但在输出时,XML程序不对其作何操作,它将被原封不动地输出。字符数据段的用处是,在某些应用环境下,希望嵌入
HTML文本,而程序员不希望XML对其进行修改,只想传递这些文本和脚本。其表示方法如下:

字符数据段="<![CDATA["+字符数据+"]]>"
例子:
<?xml version=1.0 encoding="gb2312"?>  <root>    <![CDATA[<html><head></head><body>我是一个优秀的程序员</body></html>    ]]>  </root>
"<html><head></head><body>我是一个优秀的程序员</body></html>"就是一个字符数据段。



 引用

引用是用符号代表指定的内容,或者用符号代表不能直接使用的其他符号。其分为实体引用和字符引用。实体引用就是用一个符号代替一段很长的内容,解析时又会被还原
成原来的字符实体;而字符引用就是将一些字符及键盘上无法输入的字符,用字符引用。引用的格式如下:

   
 口实体引用:“&”+实体引用名+“:”。例如:&company    口字符引用:“&#”+字符的十六进制或十进制的ASCII值+“;”。例如:®
    下面是有关引用的实例。
<?xml version=1 .0 encoding="gb2312"?><!DOCTYPE 就业信息(<!ENTITY company  "上海嘉鉴信息技术有限公司">]>  <就业信息>    <公司名称>&company</公司名称></就业信息>


注释

  注释比较简单.它在代码中所占的重要性.只不过是对代码的一种解释。但是希望读者能养成一种习惯,就是写代码时,要记住在代码旁边给予一定的注释、这样写出来的代码段就比较较容易被他人阅读。注释的格式如下:

<!--注释的内容-->


处理指令

    处理指令允许文档中包含由应用程序来处理的指令。即在XML文档中,可能会包含一些非XML格式的数据,这些数据XML无法处理,此时就可以使用处理指令,调用其他的程序来
处理这些数据。例如要处理Excel/CSS
    处理指令的语法是以“<?”开头,以“?>”结尾。下面是一个常见的处理指令的实例:
<?xm1-stylesheet href="hello.css" type="text/css"?>
    此处的"xml-stylesheet"就是处理指令,它调用Execl或者使用css来处理表格数据,因为这些数据XML无法处理。


空白处理

 在XML文档中,可以在元素中使用一个特殊的属性“xml:space",来通知应用程序保留此元素的空白,在使用时必须要进行声明。"xml:space"属性必须被声明为Enumerated(枚举)类型,它的值必须是"default"和"preserve"两者之一,或者是两者都取。
    口default:表示对此元素使用应用程序的默认空白处理模式。
    口preserve:指示应用程序保留所有的空白
  如果一个元素使用了"xml:space"属性,将适用于该元素内容中的所有元素,除非被另一个个"xml:space"属性的实例所覆盖。


行尾处理

 在XML空白字符中,有两个标准的ASCII码行尾控制字符,一个是回车(#xA ),一个是换行(#xD)。在XML处理器解析前,要将所有的两字符序列##xD#xA以及单独的字符都转换成#xA


语言标识

在文档处理中,标识出其内容所使用的自然或人工语言,非常有用。可以在文档中插入一个属性"xml:lang",来指定文档所使用的语言。
    "xml:lang"属性一旦设定,将适合于它所在元素中的所有属性及元素的内客,除非被元素内容中另一个元素的"xml:lang"属性所覆盖。


关于XML的高级知识

什么才是格式良好的XML文档

   什么才是格式良好的XML文档呢?如果一个XML文档有且只有一个根元素,符合XML元素的嵌套规则,满足XML规范中所定义的所有格式正确性的约束,每一个已分析实体都格式正确,称之为格式良好的XML文档。
    那么需要满足什么样的格式约束才算格式良好的XML,下面给出了详细的说明。
    (l)文档必须从XML声明开始。
    口XML声明必须位于该文件的最开始位置。
    口XML必须紧跟在"<?"之后,中间不能有空格等字符。
    (2)唯一的根元素。
    口根元素必须唯一。
    口根元素嵌套其他所有的后代元素。
    口根元素必须有起始标签和结束标签。
    口XML文档中的其他非元素节点不一定包含在根元素中。
    (3)标签必须是闭合的。
    起始标签必须有一个相应的结束标签与之对应。
    (4)空标签的约定。
    口空标签必须用"/>"来结束。
    口空标签可以带有属性。
    (5)层层嵌套。
    口子元素必须嵌套在父元素内,不能互相交错。
    口同层元素必须互相并列,不能互相嵌套。
    (6)区分大小写。
    起始标签与结束标签大小写必须要分清。
    (7)属性设定。
    属性赋值时都必须使用引号。
    (8)特殊的字符表示法。
    预定义实体用实体引用方式。
    如果能够满足以上所列出的内容,可以说这篇XML算是格式良好的XML。其实以上列出来的所有项,都是有关语法方面的注意点。XML对语法的要求比较严格,希望读者能够按照相关的语法规则编写XML文档。





DTD文档的作用

 DTD  (Documnet Type Definition)就是一个规范XML文档结构的文档,其实,它起着规范XML中数据的数据结构的作用。下面将详细讲述如何编写DTD文档。DTD的定义是什么呢?通过以下的说明,学习DTD的规范。
    (I)文档类型的定义:定义允许什么或不允许什么在文档中出现。预先规定文档中元素的结构、属性类型和实体引用等,可直接在文档中定义DTD,或引用外部DTD。DTD不一定是必需的,在需要的时候可以定义DTD。
    (2)  DTD的调用:合法的XML文档必须遵循某一类文档的结构声明,一旦声明就会与此类文档相应结构关联起来。DTD的调用就是指定文档使用什么样的DTD,它出现在文档的XML声明后,基本元素之前。DTD可以包含在XML文档中,也可以在外部定义,然后在XML文档中直接引用。


内部DTD例子


<?xml version="1.0" encoding="gb2312"  standalone="yes"?><!Docutppe 就业信息[<!ELEMENT 就业信息 (#PCDATA)>]>   <!-内部定义DTD文件一> <就业信息>暂无信息</就业信息>

外部DTD例子


文件名:Jobinfo.dtd<!ELEMENT Jobinfo(#PCDATA)><?xml version="1.0" encoding="gb2312"  standalone="yes"?><!DOCTYPE Jobinfo SYSTEM "JObinfo.dtd"><卜外部DTD文件一><就业信息>暂无信息</就业信息>



DTD的结构

对于程序员来说,无须自己编写DTD文件和掌握DTD的完整语法,只需要建立对DTD文档的直观认识就可以。为了能够让读者对DTD文档有个大概的了解,下面将简单介绍关于DTD文档的结构,包括元素类型的声明、属性表的声明、实体的声明、记号的声明。
    

    元素类型的声明

    元素类型的声明定义元素的名称和元素的内容,定义文档中允许什么元素和不允许什么元素、元素出现的次序。如果没有明确允许,那就是禁止。元素类型声明的语法如下:
    <!ELEMENT元素(元素内容说明)>
    其中元素内容说明有5种形式,分别是EMPTY,  ANY,混合内容、#PCDATA、元素内客,
下面将分别讲述它们的使用场所。
    口EMPTY:空元素的内容。
    口ANY:任意元素的内容。
    口混合内容:可以出现字符数据、子元素或者两者的混合体。
    口#PCDATA:只能出现字符数据。
    口元素内容:只能出现子元素,不能直接出现字符数据。
    ( 1) #PCDATA的内容。只有字符数据才能作为元素的内容,其声明语法如下:
    <!ELEMENT元素名(#PCDATA)>


   属性表的声明

    属性由"="分割开的属性名值对构成,它只能出现在元素标签的内部,其包含了有关元素的信息。属性表的声明语法如下:
    <!ATTL工ST 对应的元素名 属性名 属性取值类型  属性默认值>
    在XML文档中:
    <月薪 货币单位="人民币">6000</月薪>
    对应的DTD文档中:
 <!ELEMENT 月薪(#PCDATA)>
 <!ATTLIST 月薪 货币单位 CDATA "人民币">



   属性的取值类型

属性取值类型有很多种,如下所示:
口CDATA:可以解析的字符数据。
口Enumerated:枚举型,取值必须从中选出
口ENTITY:在DTD中声明的实体。
口ENTITIES:在DTD中声明的若干个实体。
口ID:取值在文档中必须是唯一的。
口IDREF:文档中某个元素的ID属性值。
口NMTOKEN:任意不含空格的XML名称。
口NMTOKENS:由空格分开的多个XML名称。
口NOTATION ;在DTD中声明的记号名。



   默认声明

默认声明可以有4种默认设置:#REQUIRED,#IMPLIED,#FIXED+默认值,默认值。
    口#REQUIRED ;说明必须为7C素提供该属性。
    口#IMPLIED ;说明元素可以包含该属性.也可以不包含该属性。
    口#FIXED+默认值:说明一个固定的属性默认值,文档的编写者不能修改该属性的位。
    口默认值:同上一种几乎差不多,只不过该属性值可以改变。



   记号声明

    所谓记号声明就是用记号标识非XML格式数据,应用程序就利用记号来识别和处理数据,
记号用于描述非XML格式的数据。在DTD中,NOTATION声明为特殊的数据类侧制作记号。
记号声明的语法如下:
<!NOTITION 记号名 SYSTEM "外部标识">
例如:
<!NOTITION TIFF SYSTEM "Image/tiff">




关于XML文档的操作

到目前为止,如果想利用基于树的思想来操作XML文件,可以使用Dom, JDom和Dom4J组件。大名鼎鼎的Hibernate框架使用Dom4J组件来读取名为hibernate.cfg.xml的XML配置文件。当然还有Sax等组件。我们知道 聊天室的聊天记录就是可以记录成 xml文件的。我们可以使用这些组件进行创建xml文件以及进行解析。


下面是一个如何通过Dom4J组件的API来实现解析XML文件的实例。
Dom4jApp.java文件用来实现解析dept.xml文件


Dorn4jApp.java

public class   Dom4jApp{public Dom4jApp()//构造函数{}public static void parseXML()//解析XML文件{SAXReader parser=new SAXReader();//获取解析对象try{    Document doc=parser.read(new File("depts.xml"));    //获取和输出根元素    Element root=doc.getRootElement();//获取根元素对象    String rootName=root.getName();//获取根元素对象名称    System.out.println(rootName);//输出根元素名称    //获取和输出儿子元素    List<Element> list=root.elements();//获取根元素下的儿子对象    //遍历根元素下的儿子对象      for(Element e:list){ String eName=e.getName();//获取儿子对象的名字System.out.println(eName);//输出儿子对象的名称List<Attribute> atts=e.attributes();//获取当前儿子的属性对象//遍历儿子对象的属性for(Attribute att:atts){        String attName=att.getName();//获取属性的名字        String attValue=att.getValue();//获取属性的值          System.out.println(attName+"--"+attValue);}//获取和输出孙子对象Iterator<Element> iter=e.elementIterator()://获取孙子对象//遍历孙子对象while(iter.hasNext()){Element child=iter.next();String childName=child.getName();//获取孙子对象名称String childText=child.getText();//获取孙子元素的内容System.out.println(childName+"---"+childText);}      }}catch(Exception e){    e .printStackTrace();}}public static void main(String[]args)//主函数{parseXML();//调用parseXML方法}}


dept.xml
<?xml version="1.0" encoding="GBK"?><depts>      <dept deptid="1">  <!--编号为1的部门记录-->          <deptname>行政部</deptname>            <deptnum>20</deptnum>          <deptdesc>行政相关</deptdesc>      </dept></depts>




常见问题

XML和HTML的区别

答:它们之间有着很多共同点和不同点。下面具体分析。
口XML不是要替换HTML,实际上XML可以视作是对HTML的补充。XM和HTML的目标不同:HTML的设计目标是显示数据并集中于数据外观,而XML的设计目标是描述数据并集中干数据的内容。
口与HTML相似,XML不进行任何操作,虽然XML标记可用干描述订单项的结构但它  不包含可用于发送或处理该订单,以及确保按该订单交货的任何代码。程序中必须编写代码,来实际对XML格式数据的操作。
口与HTML不同,XML标记由架构或文档的作者定义,并且是无限制的。HTML标记则是预定义的,HTML作者只能使用当前HTML标准所支持的标记。


XML有哪些显示数据的方式

    答:有多种方式可用于显示(或提供)XML数据,数据绑定的机制可与样式表一起使用,
以可视形式展示XML数据,并添加交互性。以下是显示XML的几种方法:
    口XSLT-可扩展样式表语言。
    口CSS一级联样式表。
    口IE浏览器。

0 0
原创粉丝点击