我的XML学习笔记

 

1 实体:

用于定义可以替换的字符或数据。可以理解成一个常量。它必须包含在DOCTYP声明中。例如:

<?xml version="1.0" encoding="gbk"?>

<!--开始声明DTD-->

<!DOCTYPE a[        <!--此处名称必须与根元素同名-->

<!ELEMENT a (b)>    <!--声明根元素a,包含 子元素b-->

<!ELEMENT b (name,age)> <!--元素b包含两个元素nameage-->

<!ELEMENT name (#PCDATA)>   <!--两个元素的类型都是#PCDATA-->

<!ELEMENT age (#PCDATA)>

<!ENTITY ONE "KING"><!--声明实体-->

]>

<a>

       <b>

              <name>&ONE;</name><!--[引用实体]-->

              <age>32</age>

       </b>

</a>引用时使用&ONE;就可以替换实体”king”

 

2 DTD

用于定义xml文档中标签的格式,以方便在文档传递后根据DTD对文档进行解析。DTD可以写在xml文档中,也可以引用一个文本。例如:

 

直接在xml中定义DTD

<?xml version="1.0" encoding="GB2312"?>

<!DOCTYPE 家庭成员[

<!ELEMENT 姓名 (#PCDATA)>

<!ENTITY ONE "KING">

]>

其中<!ELEMENT 姓名 (#PCDATA)>定义了姓名标签只能是(#PCDATA)字符格式

 

引用外部DTD文件

xml文档同目录下创建一个a.dat文档。

<!ELEMENT a (#PCDATA)>

<!ENTITY ONE "KING">

 

然后在xml中引用这个文档

<?xml version="1.0" encoding="GB2312"?>

<!DOCTYPE 家庭成员 SYSTEM "a.dtd">

值得注意的是使用外部方式时LEEMENT的标签必须是英文,使用中文会报错。

 

DTD例子:

<!ELEMENT a (b+)>    //说明一个根标签 +表示必须出现一次

<!ELEMENT b (name, age)>    //说明一个子标签,同时说明以下的子标签元素

<!ELEMENT age (#PCDATA)>  //说明标签元素的类型

<!ELEMENT name (#PCDATA)>

<!ATTLIST a abc CDATA "123"> //说明标签a的属性abc的默认值是123

<!ENTITY one "king"> //说明实体one它的值是king

 

3 元素类型声明

<!ELEMENT 元素名(元素内容说明)>

元素内容包含五个

A  EMPTY  空元素内容

B  ANY    任意元素内容

C  指定元素:元素内只能出现指定的子元素。例如:<!ELEMENT 就业信息(公司名,简介,地址,职位*>

在子元素后跟*号说明该子元素可以出现任意多次,+号说明可以出现至少一次,?号说明可以最多一次。 另外子元素出现的顺序必须与声明顺序一致

D   混合内容

 

4 标签属性。

可以在标签中指定属性,例如:<月薪 货币单位=”人民币”>6000</月薪>

DTD中属性声明:

<!ELEMENT 月薪 (#PCDATA)>

<!ATTLIST 月薪 货币单位 CDATA ”人民币”>

声明的语法:

<!ATTLIST 对应元素名  属性名 属性类型 默认值”>

例如:

<?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 "电影"><!--声明元素movie的属性type,默认值是“电影”-->

]

>  

<movies>

   <movie><!--如果没有显示声明属性值,那么就使用默认属性值-->

          <title> 空中监狱 </title>

          <actor> 尼古拉斯 凯奇</actor>

          <rating>家长指引</rating>

       </movie>

       <movie type="恐怖片">

          <title> 幽灵 </title>

          <actor> 黛米 摩尔</actor>

          <actor> 帕特里克 斯韦兹</actor>

          <rating>家长指引</rating>

       </movie>

</movies>

 

强制使用哪个指定属性:FIXED

<!ATTLIST movie type CDATA #FIXED "电影">

 

 

不强制提供属性值IMPLIED

<!ATTLIST movie type CDATA #IMPLIED>

5 命名空间声明

当标签元素中有重名,xml解析器就会出错。这个时候就要用到命名空间。

声明命名空间格式:xmlns:前缀名="url"

例如:

<?xml version="1.0" encoding="gb2312" ?>

<!--在根元素中,声明前缀-->

<sample xmlns:ins="http://www.Aptech_edu.org"

       :tea="ddddd">

       <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= "http://www.Aptech_edu.ac"

xmlns:tea= http://www.tea.org">

<batch-list>

       <batch type= thirdbatch>第三批次</batch>

       <batch tea:type= thirdbatch>第三批茶 </batch>

       <batch>午班批次</batch>

. . .

第二个batchtype属性有一个前缀tea。所以它与第一个type是不同的两个属性。

通常命名空间声明在根元素当中。前缀后面跟的字符串不一定是个域名,可以是其他的字符串,它只不过是标识而已。

 

6 css样式表

通过样式表可以指定页面中的标签元素的显示方式。例如:

<!—

h3{color:red;font-style:italic;}

-->

<h3>whlcome to css world!</h3>

在注释中说明了标签h3标签的样式,那么h3标签显示时就会是指定的样式

 

xml当中,是将css独立成一个单独的文件。使用时将其导入。

xml中导入css文件的格式:

<?xml-stylesheet type=”text/css” href=”info.css”?>

 

Info.css文件:

h3{color:red;font-style:italic;}

这样就可以指定xml当中标签的样式

 

7 schema

它与DTD一样都是预定义和约束xml文档的。不过schema功能更强大,

Schema是一个*.xsd文件。使用时在xml文档中引入

 

完整例程:


schema
文件:

<?xml version="1.0" encoding="gb2312"?>

<!--schema的根元素,elementFormDefaul:元素是否受控,attributeFormDefault:属性是否受控-->

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">

       <xsd:element name="class">      <!--定义根元素-->

              <xsd:complexType><!--用于包括class元素的子元素-->

                     <xsd:sequence>

                            <xsd:element name="student" maxOccurs="unbounded"><!--用于包括student元素的子元素和属性-->

                                   <xsd:complexType>

                                          <xsd:sequence><!--说明包含的子元素必须按顺序出现-->                                           

                                                 <xsd:element name="age"/><!--student的子元素-->

                                          </xsd:sequence>

                                          <xsd:attribute name="studentId" type="xsd:int"/><!--student的属性-->

                                          <xsd:attribute name="name" type="xsd:string"/>

                                   </xsd:complexType>

                            </xsd:element>

                     </xsd:sequence>

              </xsd:complexType>

              <xsd:unique name="StudentIdUnique">

                     <!--说明唯一约束-->

                     <xsd:selector xpath=".//student"/>

                     <!--路径student标签下的-->

                     <xsd:field xpath="@studentId"/>

                     <!--@studentId属性必须唯一-->

              </xsd:unique>

       </xsd:element>

</xsd:schema>

 

Xml文件:

<?xml version="1.0" encoding="gb2312"?>

<class xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="class.xsd">

       <student studentId="1" name="李华">

              <age>32</age>

       </student>

       <student studentId="2" name="张建">

              <age>32</age>

       </student>

       <student studentId="3" name="王淘">

              <age>32</age>

       </student>

       <student studentId="4" name="马明语">

              <age>32</age>

       </student>

</class>

 

 

 

 

element元素:

 

 

       标签元素,该元素定义标签,有以下几个属性

       Name:名称属性

       Type: 类型属性

       Ref: 表示该元素属于上级元素的子元素。

       Fixed:表示该元素的值是不能改变的。

       Default:默认值

       minOccurs="2" maxOccurs="unbounded":       最大值和最小值

注意:只有minOccursmaxOccurs是在声明子元素时使用。其他的是在说明具体说明元素中使用,例如:

<xs:element name="st">

              <xs:complexType>

                     <xs:sequence>

                            <xs:element ref="Id" minOccurs="2" maxOccurs="unbounded" />

                            <xs:element ref="Name"/>

                     </xs:sequence>

              </xs:complexType>

       </xs:element>

       <xs:element name="Id" fixed="3" type="xs:int"/>

       <xs:element name="Name" type="xs:string"/>

 

attribute元素

该元素用于说明标签的属性,它必须包含在complextype标签之中,并且必须在子元素之后。例如:

<xs:element name="st">

              <xs:complexType>

                     <xs:sequence>

                            <xs:element ref="Id"/>

                            <xs:element ref="Name"/>

                     </xs:sequence>

                     <xs:attribute name="time" type="xs:string" default="3"/>

              </xs:complexType>

       </xs:element>

注意:它不能用于说明末级标签。

 

complextype元素

用于包含标签的子标签和属性。如果一个标签元素不是末级标签,那么它的子标签和属性必须包含在complextype之中。

 

restriction元素

限定取值范围,它必须包含在simpletype标签中。例如:

<xs:element name="Id">

              <xs:simpleType>

                     <xs:restriction base="xs:int">

                            <xs:minInclusive value="3"/>

                            <xs:maxInclusive value="6"/>

                     </xs:restriction>

              </xs:simpleType>

       </xs:element>

 

五 unique元素

该元素说明元素值和属性的唯一性约束。例如:

<xs:element name="class">

              <xs:complexType>

                     <xs:sequence>

                            <xs:element ref="st" minOccurs="1" maxOccurs="unbounded"/>

                     </xs:sequence>

              </xs:complexType>

 

              <xs:unique name="stUniqe">

                     <xs:selector xpath=".//st"/>

                     <xs:field xpath="@time"/>

              </xs:unique>

 

              <xs:unique name="stUniqe1">

                     <xs:selector xpath=".//st"/>

                     <xs:field xpath="Id"/>

              </xs:unique>

       </xs:element>

 

stUniqe标签约束了st标签的time元素必须是唯一的。stUniqe1标签约束了st子元素Id必须唯一。注意,该标签必须与需要约束的标签同级。

 

sequence元素

该元素说明包含的子元素必须按顺序出现。

 

 

 

 

8 文档模型对象DOM

1  DOM定义了应用程序如何存取xml文档

 

2  DOM以节点的方式操作,节点可以是元素、属性、文本。DOM遍历整个xml文档,当遇到节点就会创建一个节点对象。并按父子关系创建节点树。

 

3 XML DOMDocument对象:xml文档的根,DOM的第一个节点对象。

 

4 XML DOMNode对象:节点对象。其他的节点例如元素、属性、文本(domattrbut domelement domtext)都是继承它。

 

5 XML DOMNodelist对象:节点集合对象

 

6 XML DOMElement对象:元素对象

 

7 XML DOMAttribute对象:属性对象

 

8 XML DOMText对象:元素或属性的文本内容

 

通过DOMxml文档的顺序

A 声明DOM解析器

B 给解析器定位xml文档地址

C 声明document对象,

D document对象取所有元素节点赋值给节点集合对象。

E 遍历节点集合,并逐个取出元素节点。用元素对象接收

F 判读元素是含有属性,如果有,使用属性集合对象接收所有属性,并遍历。

G 用属性节点对象接收。

 

例程:

    //用缓存读取argv

    BufferedReader in = new BufferedReader(new FileReader("student.xml"));

    DOMParser parser = new DOMParser();//实例化DOM解析器

    parser.parse(new InputSource(in));//解析器定位xml文档

    Document doc = parser.getDocument();//声明文档对象,并用解析器创建一个实例

 

    NodeList nl = doc.getElementsByTagName("*");//声明一个节点集合,并取所有元素赋值给它

    Element e;//声明一个元素对象

    Attr attr;//声明一个属性对象

    NamedNodeMap nnm;//通过名称访问节点的集合,用于接收元素属性的集合

    String attrname;//属性名

    String attrval;

    int i,len;

    len = nl.getLength();

    //遍历所有节点

    for (int j=0;j < len;j++)

    {

      e = (Element)nl.item(j);//从节点集合中取一个元素节点,并做类型强制转换为元素

      //getTagName()方法取元素节点名:取元素节点值

      System.out.println(e.getTagName()+":"+e.getFirstChild().getNodeValue());

      nnm = e.getAttributes();//取元素节点属性值

      if (nnm != null)//当元素节点有属性时

      {

        for (i=0;i<nnm.getLength();i++)

        {

          attr = (Attr)nnm.item(i);

          attrname = attr.getName();

          attrval = attr.getValue();

          System.out.println(" 属性是:"+attrname+" = "+attrval);

        }

      }

 

 

9 有时候我们需要在程序中效验xml的有效性,使用如下代码:

      DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();

      dbfactory.setNamespaceAware(true);

      dbfactory.setValidating(true);

      DocumentBuilder domparser = dbfactory.newDocumentBuilder();

      Document doc = domparser.parse(new File("student.xml"));       

      System.out.println("XML文档解析完毕!");

 

 

9 XSL样式表

Xslcss功能相似,定义啦xml的输出样式

 

1 xml模板

 

定义了xsl处理xml元素按那个层级循环处理

例如:

<xsl:template match="item-info">

标签template 属性match指定了按item-info标签来循环处理输出

 

<xsl:value-of select="quantity"/>

标签:value-of输出元素标签,select属性指定输出的元素标签

 

模板中可以引入另一个模板,

使用标签<xsl:apply-templates select="item-info"/>

 

例如:

<xsl:template match="order">

              <HTML>

                     <HEAD>

                            <TITLE>

               </TITLE>

                     </HEAD>

                     <BODY>

                            <H1>XSL 模板</H1>

                            <xsl:apply-templates select="item-info"/>

                     </BODY>

              </HTML>

       </xsl:template>

这里引入了另一个模板item-info

<xsl:template match="item-info">

              <BR/>

              <DIV>

                     <I>

                            <xsl:value-of select="quantity"/>

                     </I>

              </DIV>

              <DIV>

                     <I>

                            <xsl:value-of select="item-name"/>

                     </I>

              </DIV>

       </xsl:template>

 

我们可以注意到,xsl模板中实际上包含了完整的html代码。显示也是按这些html的格式输出的。它的主要作用就是按设定样式迭代输出xml数据。

 

2 XSLT元素

通过xslt元素可以实现编程功能,它包含了选择、循环、等方法。

例如:

<xsl:template match="orderdetails">//使用根元素做模板

              <HTML>

                     <HEAD>

                            <TITLE> 使用 XSLT</TITLE>

                     </HEAD>

                     <BODY>

                            <xsl:for-each select="order">//迭代输出order标签元素

                                   <H2>

                                          <xsl:text>订单号:</xsl:text>//text元素用于插入文本

                                          <xsl:value-of select="number"/>//输出订单号标签

                                   </H2>

                                   <xsl:for-each select="item-info">//迭代输出商品信息,这里是一个嵌套循环

                                          <xsl:variable name="x" select="price"/>//声明一个变量x

                                          <H3>

                                                 <xsl:value-of select="position()"/>//引用一个方法,递增显示数组

                                                 <xsl:text>. </xsl:text>

                                                 <xsl:value-of select="item-name"/>

                                          </H3>

                                          <H4>

                                                 <xsl:text>该商品的价格为:</xsl:text>

                                                 <xsl:value-of select="$x"/>//引用变量x,注意要家$

                                          </H4>

                                   </xsl:for-each>

                            </xsl:for-each>

                     </BODY>

              </HTML>

       </xsl:template>

 

 

10 数据源对象DOS

 

DOSIE浏览器的一个控件。通过该控件可以在html代码中嵌入xml文档或xsl样式表。

这样我们就可以设计好html的版面,然后将xml的数据引入。

 

数据岛:在html页面上引用的xml文档。

1 内联数据岛:直接在html中插入xml代码。例如:

<html>

<body>

<xml id="sdb">

<?xml version= "1.0"?>

<database>

       <school-info>

       <name>Riverdale 高中</name>

       <city>纽约</city>

       <students>550</students>

       </school-info>

       <school-info>

       <name> Dream Valley 高中 </name>

       <city>布法罗</city>

       <students>650</students>

       </school-info>

       <school-info>

              <name>Sutherland 私立学校 </name>

              <city>波士顿</city>

              <students> 625 </students>

       </school-info>

</database>

</xml>

</body>

</html>

该代码不会在页面中显示,但页面中可以通过它的idsdb来引用它。

 

2 外部引用xml

 

不直接在html代码中输入xml,而是引用一个外部的xml文件。例如:

<xml id= "schools" src= "example 1.xml"> </xml>

 

然后就可以在JavaScript中引用这个id

<script language = "JavaScript">

function load()

{

              var xmlDso = schools.XMLDocument;

              var xslDso = Stylesheet.XMLDocument;        

              divResults.innerHTML = xmlDso.transformNode(xslDso);

}

</script>

 

3 绑定xml数据岛到html

有两个关键属性

 a:  datasrc指定引用xmlid

 bdatafld 映射htmlxml节点关联,已在该html标签处显示xml标签的内容。

例如:

<body>

       <xml id= "schools" src= "example 1.xml"> </xml>

       <table datasrc = "#schools" id = "school info"

            width= "80%" align="center" cellpadding= "0"

            cellspacing = "0" border= "1">

              <thead>

                     <th>学校名称</th>

                     <th>城市</th>

                     <th>学生人数</th>

              </thead>

              <tr>

                     <td valign = "top"><div datafld =

                    "name"></div></td>

                     <td valign = "top"><div datafld =

                    "city"></div></td>

                     <td valign = "top"><div datafld =

                    "students"></div></td>

              </tr>

       </table>

</body>

注意:datasrc指定的id要加前缀#

 

4 recordset对象

该对象用于存储xml文档,利用该对象可逐条访问xml记录。

该对象可在javascript语言中使用,使用该对象时需要在加xmlid前缀

例如:

 

<xml id= "schools" src= "example 1.xml"> </xml>

<script language ="Javascript">

              function firstrec()

              {

                     schools.recordset.moveFirst()

              }

</script>      

这里定义了一个函数,该函数引用了一个recordset对象,并调用方法movefirst()将游标移动到xml的第一条记录

 

5 html中同时写入xmlxsl样式表

例如:

<html>

       <head>

       <title> DSO 示例 </title>

       <script language = "JavaScript">

       load()

              {

                     xmlDso = sdb.XMLDocument;//创建xmldos对象

                     xslDso = Stylesheet.XMLDocument;//创建xsl样式表的dos对象

                           

                     divResults.innerHTML = xmlDso.transformNode(xslDso);//xml对象中指定使用xsl样式表,并显示

              }

       </script>

       </head>

      

       <body bgcolor= "#FFFFF"> 

 

        //写入xml文档

              <xml id="sdb">

              <?xml version= "1.0"?>

              <database>

                     ......

              </database>

              </xml>

 

              //写入xsl样式表

              <XML id="Stylesheet">

                     <xsl:stylesheet     

              :xsl="http://www.w3.org/1999/XSL/Transform"

              ="1.0">

                     <xsl:template match="/database">

                     ......

              </XML>

             

              <DIV ID="divResults"/>

              <input type="BUTTON" value="请单击这里" onCLick="load()">//调用load方法

              <br>

              <hr>

             

       </body>

</html>

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值