xml xml约束 DTD dom解析

XML:

在XML语言中,它允许用户自定义标签。一个标签用于描述一段数据;一个标签可分为开始标签和结束标签,在开始标签和结束标签之间,又可以使用其它标签描述其它数据,以此来实现数据关系的描述。例如:

XML是被设计用来存储数据、携带数据和交换数据的,他不是为了显示数据而设计的。

通过XML,我们可以在不兼容的系统之间交换数据。

XML技术除用于保存有关系的数据之外,它还经常用作软件配置文件,以描述程序模块之间的关系。

在一个软件系统中,为提高系统的灵活性,它所启动的模块通常由其配置文件决定

例如一个软件在启动时,它需要启动A、B两个模块,而A、B这两个模块在启动时,又分别需要A1、A2和B1、B2模块的支持,为了准确描述这种关系,此时使用XML文件最为合适不过。

一个XML文件分为如下几部分内容:

文档声明 元素属性注释  CDATA区 、特殊字符 处理指令(processing instruction)

Tip:XML语法-文档声明

在编写XML文档时,需要先使用文档声明,声明XML文档的类型。

最简单的声明语法:

       <?xml version="1.0" ?>

用encoding属性说明文档的字符编码:

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

用standalone属性说明文档是否独立:

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

常见错误:

1. <?xml version=1.0 ?>

2. <?xml version=“1.0” ?>   注意空格问题(全角半角中文还是英文的空格)  IE打开 try

3.编码错误

XML文档乱码的原因

保存的时候先保存到硬盘上 硬盘上没有中国 通过gb2312编码 可能编出来98 99  再用IE浏览器显示的时候 按照UTF-8来解析的时候 98 99就成了乱码了

解决办法: 再保存的时候 点另存为 指定编码类型为UTF-8

                     或者使用eclipse 自动指定类型utf-8

Tip:元素 (1)

XML元素指XML文件中出现的标签,一个标签分为开始标签和结束标签,一个标签有如下几种书写形式,例如:

包含标签体:<a>www.itcast.cn</a>

不含标签体的:<a></a>, 简写为:<a/>

一个标签中也可以嵌套若干子标签。但所有标签必须合理的嵌套,绝对不允许交叉嵌套 ,例如:

              <a>welcome to <b>www.it315.org</a></b>

格式良好的XML文档必须有且仅有一个根标签,其它标签都是这个根标签的子孙标签。

对于XML标签中出现的所有空格和换行,XML解析程序都会当作标签内容进行处理。例如:下面两段内容的意义是不一样的。

第一段:

<网址>www.itcast.cn</网址>

第二段:

      

<网址>

       www.itcast.cn

</网址>

由于在XML中,空格和换行都作为原始内容被处理,所以,在编写XML文件时,使用换行和缩进等方式来让原文件中的内容清晰可读的“良好”书写习惯可能要被迫改变。

元素命名规范

一个XML元素可以包含字母、数字以及其它一些可见字符,但必须遵守下面的一些规范:

区分大小写,例如,<P>和<p>是两个不同的标记。

不能以数字或"_" (下划线)开头。

不能以xml(或XML、或Xml 等)开头。

不能包含空格。

名称中间不能包含冒号(:)。

Tip:属性

一个标签可以有多个属性,每个属性都有它自己的名称和取值,例如:

              <input name=“text”>

属性值一定要用双引号(")或单引号(')引起来

定义属性必须遵循与标签相同的命名规范

多学一招:在XML技术中,标签属性所代表的信息,也可以被改成用子元素的形式来描述,例如:

              <input>

                    <name>text</name>

              </input>

Tip:注释

Xml文件中的注释采用:“<!--注释-->” 格式。

注意:

XML声明之前不能有注释

注释不能嵌套,例如:

       <!--大段注释

       ……

              <!--局部注释-->

       ……

       --> 

Tip:CDATA

在编写XML文件时,有些内容可能不想让解析引擎解析执行,而是当作原始内容处理。

遇到此种情况,可以把这些内容放在CDATA区里,对于CDATA区域内的内容,XML解析程序不会处理,而是直接原封不动的输出。

原始内容输出 用cdata区

语法:<![CDATA[ 内容 ]]>

       <![CDATA[

              <itcast>

                     <br/>

              </itcast>

       ]]>

Tip:转义字符

对于一些单个字符,若想显示其原始样式,也可以使用转义的形式予以处理。

 

实例:

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>

<soft>

<![CDATA[

<a>

        <a1>中国</a1>

        <a2></a2>

</a>

]]>

<b>

        &lt;b1&gt;&lt;/b1&gt;

        <b2></b2>

</b>

</soft>

cdata和转义字符的区别: 对程序有区别

程序读的时候 一个读原始数据 一个读转义字符   

给人看就转义 给程序原始样式用cdata

Tip:处理指令

处理指令,简称PI (processing instruction)。处理指令用来指挥解析引擎如何解析XML文档内容。

例如,在XML文档中可以使用xml-stylesheet指令,通知XML解析引擎,应用css文件显示xml文档内容。    <?xml-stylesheet type="text/css" href="1.css"?>

处理指令必须以“<?”作为开头,以“?>”作为结尾,XML声明语句就是最常见的一种处理指令。

实例程序:

Config.css

#a1{

       font-size:300px;

       color:red;

}

#a2{离线应用

       font-size:100px;

       color:green;

}

#b1{

       font-size:20px;

}

#b2{

       font-size:200px;

       color:blue;

}

Config1.xml

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>

<?xml-stylesheet type="text/css" href="config1.css"?>

<soft>

       <a>

              <a1 id="a1">中国</a1>

              <a2 id="a2">美国</a2>

       </a>

      

       <b>

              <b1 id="b1">小日本</b1>

              <b2 id="b2">英国</b2>

       </b>

</soft>

XML约束

Tip:XML约束概述

什么是XML约束

在XML技术里,可以编写一个文档来约束一个XML文档的书写规范,这称之为XML约束。

为什么需要XML约束

常用的约束技术

XML DTD

XML Schema

Tip:DTD约束快束入门

DTD(Document Type Definition),全称为文档类型定义。

Dtd 要存为unicode或者utf-8

Tip:编程校验XML文档正确性

IE5以上浏览器内置了XML解析工具:Microsort.XMLDOM,开发人员可以编写javascript代码,利用这个解析工具装载xml文件,并对xml文件进行dtd验证。

创建xml文档解析器对象

var xmldoc = new ActiveXObject("Microsoft.XMLDOM");

开启xml校验

xmldoc.validateOnParse = "true";

装载xml文档

xmldoc.load("book.xml");

获取错误信息

xmldoc.parseError.reason; 

xmldoc.parseError.line

Tip:编写DTD约束的两种方式

DTD约束即可以作为一个单独的文件编写,也可以在XML文件内编写。

Tip:在xml文件内编写DTD

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<!DOCTYPE 书架 [

       <!ELEMENT 书架 (书+)>

       <!ELEMENT 书 (书名,作者,售价)>

       <!ELEMENT 书名 (#PCDATA)>

       <!ELEMENT 作者 (#PCDATA)>

       <!ELEMENT 售价 (#PCDATA)>

]>

<书架>

       <书>

              <书名>Java就业培训教程</书名>

              <作者>张孝祥</作者>

              <售价>39.00元</售价>

       </书>

       ...

</书架>

Tip:引用DTD约束

XML文件使用 DOCTYPE6声明语句来指明它所遵循的DTD文件,DOCTYPE声明语句有两种形式:

当引用的文件在本地时,采用如下方式:

              <!DOCTYPE 文档根结点 SYSTEM "DTD文件的URL">

       例如: <!DOCTYPE 书架 SYSTEM “book.dtd”>。在xml文件中手写一下。

当引用的文件是一个公共的文件时,采用如下方式:   

              <!DOCTYPE 文档根结点 PUBLIC "DTD名称" "DTD文件的URL">

              例如:<!DOCTYPE web-app PUBLIC

              "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"

              "http://java.sun.com/dtd/web-app_2_3.dtd">

Tip DTD 的语法细节:元素定义1

在DTD文档中使用ELEMENT声明一个XML元素,语法格式如下所示:

      <!ELEMENT 元素名称 元素类型>

元素类型可以是元素内容、或类型

如为元素内容:则需要使用()括起来,如

<!ELEMENT 书架 (书名,作者,售价)>

<!ELEMENT 书名 (#PCDATA)>

如为元素类型,则直接书写,DTD规范定义了如下几种类型:

EMPTY:用于定义空元素,例如<br/> <hr/>

ANY:表示元素内容为任意类型。

元素内容中可以使用如下方式,描述内容的组成关系

用逗号分隔,表示内容的出现顺序必须与声明时一致。<!ELEMENT MYFILE (TITLE,AUTHOR,EMAIL)>

 用|分隔,表示任选其一,即多个只能出现一个

       <!ELEMENT MYFILE (TITLE|AUTHOR|EMAIL)>

在元素内容中也可以使用+、*、?等符号表示元素出现的次数:

              +: 一次或多次 (书+)

             ?: 0次或一次 (书?)

               *: 0次或多次  (书*)

也可使用圆括号( )批量设置,例

       <!ELEMENT MYFILE ((TITLE*, AUTHOR?, EMAIL)* | COMMENT)>

Tip属性定义

xml文档中的标签属性需通过ATTLIST为其设置属性

语法格式:

       <!ATTLIST 元素名

              属性名1 属性值类型 设置说明

              属性名2 属性值类型 设置说明

              ……

       >

属性声明举例:

<!ATTLIST 商品

       类别 CDATA #REQUIRED

       颜色 CDATA #IMPLIED

对应XML文件:

       <商品 类别="服装" 颜色="黄色">…</商品>

       <商品 类别="服装">…</商品>

Tip属性定义

XML编程(CRUD)增删改查

dom解析

dom 全部装载到内存一下子解析  有内存的压力 适合增删改查

sax 执行一步解析一步 只适合读

Tip:JAXP

JAXP 开发包是J2SE的一部分,它由javax.xml、org.w3c.dom 、org.xml.sax 包及其子包组成

在 javax.xml.parsers 包中,定义了几个工厂类,程序员调用这些工厂类,可以得到对xml文档进行解析的 DOM 或 SAX 的解析器对象。

Tip:使用JAXP进行DOM解析

javax.xml.parsers 包中的DocumentBuilderFactory用于创建DOM模式的解析器对象 , DocumentBuilderFactory是一个抽象工厂类,它不能直接实例化,但该类提供了一个newInstance方法 ,这个方法会根据本地平台默认安装的解析器,自动创建一个工厂的对象并返回。

Tip:获得JAXP中的DOM解析器

调用 DocumentBuilderFactory.newInstance() 方法得到创建 DOM 解析器的工厂。

调用工厂对象的 newDocumentBuilder方法得到 DOM 解析器对象。

调用 DOM 解析器对象的 parse() 方法解析 XML 文档,得到代表整个文档的 Document 对象,进行可以利用DOM特性对整个XML文档进行操作了。

 

              //创建解析工厂

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();

      

      

       //得到解析器

       DocumentBuilder builder = factory.newDocumentBuilder();

      

       System.out.println(builder);

      

      

       //解析xml文档

       Document  d = (Document) builder.parse("src/book.xml");

 

Tip:DOM编程

DOM模型(document object model)

DOM解析器在解析XML文档时,会把文档中的所有元素,按照其出现的层次关系,解析成一个个Node对象(节点)。

在dom中,节点之间关系如下:

位于一个节点之上的节点是该节点的父节点(parent)

一个节点之下的节点是该节点的子节点(children)

同一层次,具有相同父节点的节点是兄弟节点(sibling)

一个节点的下一个层次的节点集合是节点后代(descendant)

父、祖父节点及所有位于节点上面的,都是节点的祖先(ancestor)

Tip:Node对象

Node对象提供了一系列常量来代表结点的类型,当开发人员获得某个Node类型后,就可以把Node节点转换成相应的节点对象(Node的子类对象),以便于调用其特有的方法。(查看API文档)

Node对象提供了相应的方法去获得它的父结点或子结点。编程人员通过这些方法就可以读取整个XML文档的内容、或添加、修改、删除XML文档的内容了。

更新XML文档

javax.xml.transform包中的Transformer类用于把代表XML文件的Document对象转换为某种格式后进行输出,例如把xml文件应用样式表后转成一个html文档。利用这个对象,当然也可以把Document对象又重新写入到一个XML文件中。

Transformer类通过transform方法完成转换操作,该方法接收一个源和一个目的地。我们可以通过:

javax.xml.transform.dom.DOMSource类来关联要转换的document对象,

用javax.xml.transform.stream.StreamResult 对象来表示数据的目的地。

 Transformer对象通过TransformerFactory获得

l   

TransformerFactory factory = TransformerFactory.newInstance();

Transformer tf = factory.newTransformer();

tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream(filename)));

转载于:https://www.cnblogs.com/santry/archive/2011/04/24/2026267.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值