posts - 33,comments - 21,trackbacks - 0
<2006年11月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

常用链接

留言簿(4)

随笔分类(23)

随笔档案(33)

文章分类

搜索

  •  

最新评论

阅读排行榜

评论排行榜

转贴自赛迪网(http://tech.ccidnet.com/art/294/20021120/31320_2.html)


如果一个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:。
posted on 2006-11-22 17:21 英明 阅读(213) 评论(0)  编辑  收藏 所属分类: 编程

只有注册用户登录后才能发表评论。


网站导航: