第14章Java读写XML技术14.1XML简介14.2SAX接口解析XML14.3DOM接口解析XML习题14.1XML简介14.1.1XML定义XML是SGML一个简化而严格的子集,特别是为Web应用设计的,具有可扩展性、结构性和可检验性。●可扩展性指用户可以根据需要自定义新的标识以及属性名,更好地从语义上修饰数据。●结构性指XML文件结构可以嵌套,也可以复杂到任意程度。●可校验性指XML文件文件可以包括一个语法描述,应用程序可以通过语法描述对此文件进行结构检验。14.1.2XML分类图14.1XML相关标准的体系结构(基础标准)XML(元语言标准)HTTPURI/URLUnicode(外围标准)xInclude…(核心标准)RDF…(内容描述标准)cXML…(应用标准)SchemaDOM…(操作标准)CSSXSLXSLT…(样式与链接标准)1.元语言标准用来描述标准的元语言,即XML标准。XML相关标准主要分为三类,分别是元语言标准、基础标准和应用标准。2.基础标准为XML进一步实用化制定的标准,共分为五类:外围标准、核心标准、操作标准、样式与链接标准、内容描述标准。(1)外围标准指Internet网络上统一应用的标准:●HTTP协议采用请求/应答方式,客户端向服务器提交请求方式、URI、协议版本、客户端信息等,服务器向客户端返回状态信息、实体信息以及实体内容等。●URI/URL指资源定位符,用来在网络上实现快速资源定位。●Unicode指Internet网上统一传输数据的标准编码。(2)核心标准是XML核心的标准。(3)操作标准为XML文档的处理提供有效的方法与规则,DOM是与平台无关的,提供一个编程接口。Schema是对DOM的补充,提供一种更为严格的描述XML文档的结构、属性、数据类型等的方法。(4)样式与链接标准。●CSS是XML文档显示的样式标准。●XSL标准可将XML文档形成树状结构,采用元素节点匹配的方式进行转换,因而该标准提供转换和显示的标准。●XSLT标准是从XSL中分离出来的,是XML文档的转换标准,可以将XML文档转换为HTML文档并进行显示处理。(5)内容描述标准。RDF(ResourseDescriptionFormat)采用XML语法格式处理元数据的应用,是为描述图像文档和它们之间的相互关系定义的一个简单数据模型,为进行资源描述定义了资源描述的规则。3.应用标准XML标准是Internet时代的ASCII标准,主要针对具体的领域进行应用,如cXML是指电子商务XML应用标准、voiceXML指语音XML等。14.1.3XML文档的书写图14.2XML文档举例?xmlversion=1.0encoding=gb2312?-personname王飞/namecollege理工大学/collegetelephone2663457/telephonetitle教授/title/person14.1.4XML文档的解析图14.3XML文档的处理过程XML应用程序SAX接口DOM接口XML分析器XML文档14.2SAX接口解析XML14.2.1解析的步骤(1)创建SAX解析工厂的实例。SAXParserFactoryspf=SAXParserFactory.newInstance();(2)创建一个SAX解析器。SAXParsersp=spf.newSAXParser();(3)得到SAX的处理器(处理器由用户自己编写实现)。SAXHandlerhandler=newSAXHandler();(4)使用用户创建的处理器,解析器解析文件。sp.parse(newInputSource(reader),handler);14.2.2相关类在J2sdk1.4中的SAX版本为2.0,它提供DefaultHandler(org.xml.sax.helpers.DefaultHandler)接口,通过这个接口实现自己的解析器。接口中需要实现的解析函数为:publicvoidstartElement(Stringuri,StringlocalName,StringqName,Attributesattributes)throwsSAXException读取XML数据的节点元素开始时触发,需要实现这个方法进行标记元素的名字的操作。publicvoidendElement(Stringuri,StringlocalName,StringqName)throwsSAXException处理节点元素终止时触发,可以添加代码来将节点数据进行存储。publicvoidcharacters(char[]ch,intstart,intlength)throwsSAXException处理节点之间的数据,可以添加代码来读取节点间的数据值。【例14.1】编写一个SAX处理器,对14.1节中的person.xml进行解析,输出XML文件节点的标签和节点的值。分析:类SAXHandler是一个处理类,实现这个DefaultHandler接口时覆盖了上述三个方法,将读取的节点标签和节点的值存入到Hashtable对象中。类中提供了一个方法,返回读取的名-值对的Hashtable对象。输出结果如图14.4所示。源程序代码如下://程序文件名为Parse.javaimportjava.io.*;importjava.util.Hashtable;importorg.w3c.dom.*;importorg.xml.sax.*;importjavax.xml.parsers.SAXParser;importjavax.xml.parsers.SAXParserFactory;importorg.xml.sax.helpers.*;publicclassParse{publicstaticvoidmain(String[]args){try{Filefile=newFile(person.xml);FileReaderreader=newFileReader(file);//创建解析工厂实例SAXParserFactoryspf=SAXParserFactory.newInstance();//创建解析器SAXParsersp=spf.newSAXParser();//创建处理类实例SAXHandlerhandler=newSAXHandler();//解析sp.parse(newInputSource(reader),handler);HashtablehashTable=handler.getTable();//输出数据System.out.println(教师信息表);System.out.println(姓名:+(String)hashTable.get(newString(name)));System.out.println(学院:+(String)hashTable.get(newString(college)));System.out.println(电话:+(String)hashTable.get(newString(telephone)));System.out.println(职称:+(String)hashTable.get(newString(title)));}catch(Exceptione){System.out.println(e.getMessage());}}};//自定义处理类classSAXHandlerextendsDefaultHandler{privateHashtabletable=newHashtable();privateStringcurrentElement=null;privateStringcurrentValue=null;publicHashtablegetTable(){returntable;}//覆盖startElement方法,取出节点标签publicvoidstartElement(Stringuri,StringlocalName,StringqName,Attributesattributes){currentElement=qName;}//覆盖characters方法,取出节点值publicvoidcharacters(char[]ch,intstart,intlength)throwsSAXException{currentValue=newString(ch,start,length);}//覆盖endElement方法,放入HashtablepublicvoidendElement(Stringuri,StringlocalName,StringqName)throwsSAXException{if(currentElement.equals(qName))table.put(currentElement,currentValue);}};图14.4解析person.xml文件后输出结果14.3DOM接口解析XML14.3.1解析的步骤1.从DOM接口写XML的步骤(1)创建DocumentBuilderFactory的一个实例;(2)创建DocumentBuilder的一个新实例;(3)构建一个DOM对象;(4)创建ROOTELEMENT对象;(5)创建单个ELEMENT节点;(6)ELEMENT创建节点的值;(7)将ELEMENT挂接到ROOT上;(8)写入XML文件。2.从DOM接口读XML的文件步骤(1)创建DocumentBuilderFactory的一个实例;(2)创建DocumentBuilder的一个新实例;(3)根据已有的XML文件构建一个DOM对象;(4)得到ROOTELEMENT对象;(5)得到单个ELEMENT节点;(6)得到ELEMENT创建节点的值。14.3.2相关类1.DocumentBuilderFactory类publicabstractclassDocumentBuilderFactoryextendsObject定义工厂API,使得应用程序得到解析器从XML文档中产生的DOM对象树。publicstaticDocumentBuilderFactorynewInstance()throwsFactoryConfigurationError得到DocumentBuilderFactory的一个实例,这个实例某个时刻只能用于一个线程。publicabstractDocumentBuildernewDocumentBuilder()throwsParserConfigurationException使用当前配置的方法创建一个新的DocumentBuilder的实例。2.DocumentBuilder类publicabstractclassDocumentBuilderextendsObject定义从XML文档得到DOM文档的API。publicabstractDocumentnewDocument()得到DOM文档对象的一个新实例,用来构建DOM树。publicDocumentparse(Filef)throwsSAXException,IOException解析给定的XML文档f,返回DOM文档对象。3.Document类publicinterfaceDocumentextendsNodeDocument接口代表整个XML文档。publicElementcreateElement(StringtagName)throwsDOMException创建指定的类型的元素tagName。publicTextcreateTextNode(Stringdata)使用给定的data字符串创建节点元素的值。4.Element类publicinterfaceElementextendsNodeElement接口代表XML文档中的一个元素。publicNodeListgetElementsBy