UML软件工程组织

整合Java与XML的新应用(2)
作者:谷和启 本文选自:开放系统世界——赛迪网 2002年11月20日

如果一个XML文档符合上述文档所表现出来的一些特征,即可称之为良构的XML文档。这些特征如下:

1. 每个元素必须有起始和结束标记;

2. 文档只有一个根元素;

3. 正确地对空元素进行格式化;

4. 开始和结束标注必须匹配(区分大小写);

5. 元素必须正确地嵌套;

6. 属性值必须用引号括起来。

IsXMLAvailable.java 是用于进行XML文档良构检验的Java程序,代码如下:

//IsXMLAvailable.java
import java.io.File;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.*;
public class IsXMLAvailable{
public static void main(String argv[]){
if (argv.length!=1){
System.out.println("参数错误!");
System.exit(1);
}
try{
//取得工厂类的一个新实例
DocumentBuilderFactory dbf=
DocumentBuilderFactory.newInstance();
//通过静态方法创建DocumentBuilder 实例
//准备建立Document 对象
DocumentBuilder db=dbf.newDocumentBuilder();
//建立XML 文档对象
Document doc=db.parse(new File(argv[0]));
//格式化文档
doc.getDocumentElement().normalize();
System.out.println("XML 文件结构正确!");
}
catch(SAXParseException e){
//错误提示,SystemID 为全路径的文件名
System.out.println("XML 在第" +
e.getLineNumber()+"行出错异常,文件信息:"+e.getSystemId());
System.out.println("\n"+e.getMessage());
}
catch(SAXException ex){
ex.printStackTrace();
}
catch(Throwable th){
th.printStackTrace();
}
}
}

运行“java IsXMLAvailable People.xml”命令,如程序出错,则显示第几行有错,并给出可能的错误提示;如程序正确,则显示 “XML 文件结构正确!”

建立一个有效的XML 文档(DTD)及验证的实例

良好的XML 文档只说明了其语法正确,并没有解决语义问题。XML 描述了有一定含义的数据,其中可以指定包含数据的规则。通过这种指定的规则,可以验证已声明符合规则的XML 文档的有效性,即DTD——文档类型定义。

DTD 可以确保应用程序接收到一个有效的XML 文档,然后可以针对某一类XML 设计出应用程序接口。这样符合某种DTD 的XML 文档都可以被应用程序解析,也可以用DTD 制定自己的文档规则,而这个规则可被其它应用程序利用。DTD 有两种方法声明XML文件:

(1) 外部 DTD 声明如下:

<!DOCTYPE peopleinfo SYSTEM "People.dtd">

(2) 内部 DTD 声明(PeopleDTD.xml)如下:

<? xml version="1.0" encoding="GB2312"?>
<! DOCTYPE PeopleInfo[
<! ELEMENT PeopleInfo(People+)>
<!ELEMENT People(Peoplename, PeopleSex,PeopleAge)>
<! ELEMENT PeopleName(#PCDATA)>
<! ELEMENT PeopleSex(#PCDATA)>
<! ELEMENT PeopleAge(#PCDATA)>
<! ATTLIST People PeopleId CDATA #REQUIRED>
]>
<PeopleInfo>
<People PeopleId="YOUR">
<PeopleName> 古董 </PeopleName>
<PeopleSex> 男 </PeopleSex>
<PeopleAge> 23 </PeopleAge>
</People>
<People PeopleId="SHEN">
<PeopleName> 王冠 </PeopleName>
<PeopleSex> 女 </PeopleSex>
<PeopleAge> 25 </PeopleAge>
</People>
</PeopleInfo>

从上面的文件可以看到内嵌的DTD 在<! DOCTYPE> 标记中。首先声明的是XML 文档的根元素<PeopleInfo>,然后指明在<PeopleInfo>根元素中必须包含有一个或是多个的<People>元素(用People+ 表示)。下一句定义了在<People>元素中必须包含<PeopleName>、<PeopleSex>和<PeopleAge>3个元素。这3个元素的内容类型为#PCDATA,表示内容为文本类型。然后是对属性的定义,表示PeopleInfo 必须含有PeopleId 属性。#REQUIRED(必须含有)默认的可以省略,CDATA 表示属性值是字符串型。

要检验一个XML 文件是否有效需要在解析XML 文件时检验其是否有效。首先在创建DocumentBuilder 对象之前,利用语句设置有效性检验,语句如下:

dbf.setValidating(true);//设置对XML 文件进行有效验证

因为SAX 在解析XML 文件时,遇到不符合DTD规定的地方要触发相应的事件,所以还要在程序中定义实现了事件接口的类。在这里用的是常用的处理事件的静态内部类,在此类中必须实现的方法语句如下:

public void warning(SAXParseException spe) throws SAXExcepton
public void error(SAXParseException spe) throws SAXExcepton
public void fatalError(SAXParseException spe) throws SAXExcepton

不同级别的错误事件将分别触发这3个方法中的一个。

在IsXMLAvailableDTD.java 中,提供了对XML 文档进行有效性检验的源程序。从中可以看到SAX事件驱动的解析XML程序的编写方式http:。



版权所有:UML软件工程组织