




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第14章 Java读写XML技术 14.1 XML简介简介 14.2 SAX接口解析接口解析XML 14.3 DOM接口解析接口解析XML 习习 题题 14.1 XML 简简 介介14.1.1 XML定义定义 XML是SGML一个简化而严格的子集,特别是为Web应用设计的,具有可扩展性、结构性和可检验性。 可扩展性指用户可以根据需要自定义新的标识以及属性名,更好地从语义上修饰数据。 结构性指XML文件结构可以嵌套,也可以复杂到任意程度。 可校验性指XML文件文件可以包括一个语法描述,应用程序可以通过语法描述对此文件进行结构检验。14.1.2 XML分类分类图14.1 XML相关标准的体系结构(
2、基础标准)XML(元语言标准)HTTPURI/URLUnicode(外围标准)xInclude(核心标准)RDF(内容描述标准)cXML(应用标准)SchemaDOM(操作标准)CSSXSLXSLT(样式与链接标准)1. 元语言标准元语言标准用来描述标准的元语言,即XML标准。 XML相关标准主要分为三类,分别是元语言标准、基础标准和应用标准。 2. 基础标准基础标准 为XML进一步实用化制定的标准,共分为五类:外围标准、核心标准、操作标准、样式与链接标准、内容描述标准。 (1) 外围标准指Internet网络上统一应用的标准: HTTP协议采用请求/应答方式,客户端向服务器提交请求方式、UR
3、I、协议版本、客户端信息等,服务器向客户端返回状态信息、实体信息以及实体内容等。 URI/URL指资源定位符,用来在网络上实现快速资源定位。 Unicode指Internet网上统一传输数据的标准编码。 (2) 核心标准是XML核心的标准。 (3) 操作标准为XML文档的处理提供有效的方法与规则,DOM是与平台无关的,提供一个编程接口。Schema是对DOM的补充,提供一种更为严格的描述XML文档的结构、属性、数据类型等的方法。 (4) 样式与链接标准。 CSS是XML文档显示的样式标准。 XSL标准可将XML文档形成树状结构,采用元素节点匹配的方式进行转换,因而该标准提供转换和显示的标准。
4、XSLT标准是从XSL中分离出来的,是XML文档的转换标准,可以将XML文档转换为HTML文档并进行显示处理。 (5) 内容描述标准。 RDF(Resourse Description Format)采用XML语法格式处理元数据的应用,是为描述图像文档和它们之间的相互关系定义的一个简单数据模型,为进行资源描述定义了资源描述的规则。 3. 应用标准应用标准 XML标准是Internet时代的ASCII标准,主要针对具体的领域进行应用,如cXML是指电子商务XML应用标准、voiceXML指语音XML等。14.1.3 XML文档的书写文档的书写图14.2 XML文档举例 王飞 理工大学 26634
5、57 教授 14.1.4 XML文档的解析文档的解析图14.3 XML文档的处理过程XML应用程序SAX接口DOM接口XML分析器XML文档14.2 SAX接口解析接口解析XML14.2.1 解析的步骤解析的步骤(1) 创建SAX解析工厂的实例。SAXParserFactory spf = SAXParserFactory.newInstance();(2) 创建一个SAX解析器。SAXParser sp = spf.newSAXParser();(3) 得到SAX的处理器(处理器由用户自己编写实现)。SAXHandler handler = new SAXHandler(); (4) 使用用
6、户创建的处理器,解析器解析文件。sp.parse(new InputSource(reader), handler);14.2.2 相关类相关类 在J2sdk1.4中的SAX版本为2.0,它提供DefaultHandler(org.xml.sax.helpers.DefaultHandler)接口,通过这个接口实现自己的解析器。接口中需要实现的解析函数为: public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException 读取XML数据的
7、节点元素开始时触发,需要实现这个方法进行标记元素的名字的操作。 public void endElement(String uri, String localName, String qName) throws SAXException 处理节点元素终止时触发,可以添加代码来将节点数据进行存储。 public void characters(char ch, int start, intlength) throws SAXException 处理节点之间的数据,可以添加代码来读取节点间的数据值。 【例14.1】编写一个SAX处理器,对14.1节中的person.xml进行解析,输出XML文件节
8、点的标签和节点的值。 分析:类SAXHandler是一个处理类,实现这个DefaultHandler接口时覆盖了上述三个方法,将读取的节点标签和节点的值存入到Hashtable对象中。类中提供了一个方法,返回读取的名-值对的Hashtable对象。输出结果如图14.4所示。源程序代码如下:/程序文件名为Parse.javaimport java.io.*; import java.util.Hashtable;import org.w3c.dom.*; import org.xml.sax.*;import javax.xml.parsers.SAXParser; import javax.x
9、ml.parsers.SAXParserFactory;import org.xml.sax.helpers.*;public class Parsepublic static void main(String args)tryFile file = new File(person.xml);FileReader reader = new FileReader(file);/创建解析工厂实例 SAXParserFactory spf = SAXParserFactory.newInstance(); /创建解析器 SAXParser sp = spf.newSAXParser(); /创建处理
10、类实例 SAXHandler handler = new SAXHandler(); /解析 sp.parse(new InputSource(reader), handler); Hashtable hashTable = handler.getTable(); /输出数据System.out.println(教师信息表); System.out.println(姓名:+ (String)hashTable.get(new String(name); System.out.println(学院: + (String)hashTable.get(new String(college); Sys
11、tem.out.println(电话: + (String)hashTable.get(new String(telephone); System.out.println(职称: + (String)hashTable.get(new String(title); catch(Exception e) System.out.println(e.getMessage(); ;/自定义处理类class SAXHandler extends DefaultHandler private Hashtable table = new Hashtable(); private String current
12、Element = null; private String currentValue = null; public Hashtable getTable() return table; /覆盖startElement方法,取出节点标签 public void startElement(String uri,String localName,String qName,Attributes attributes) currentElement = qName; /覆盖characters方法,取出节点值 public void characters(char ch, int start, int
13、 length) throws SAXException currentValue = new String(ch, start, length); /覆盖endElement方法,放入Hashtable public void endElement(String uri,String localName,String qName) throws SAXException if (currentElement.equals(qName) table.put(currentElement, currentValue); ;图14.4 解析person.xml文件后输出结果14.3 DOM接口解析
14、接口解析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的一个新实例
15、;(3) 根据已有的XML文件构建一个DOM对象;(4) 得到ROOTELEMENT对象;(5) 得到单个ELEMENT节点;(6) 得到ELEMENT创建节点的值。14.3.2 相关类相关类1. DocumentBuilderFactory类类public abstract class DocumentBuilderFactory extends Object定义工厂API,使得应用程序得到解析器从XML文档中产生的DOM对象树。public static DocumentBuilderFactory newInstance() throws FactoryConfigurationErro
16、r得到DocumentBuilderFactory的一个实例,这个实例某个时刻只能用于一个线程。public abstract DocumentBuilder newDocumentBuilder() throws ParserConfigurationException使用当前配置的方法创建一个新的DocumentBuilder的实例。2. DocumentBuilder类类public abstract class DocumentBuilder extends Object定义从XML文档得到DOM文档的API。public abstract Document newDocument()
17、得到DOM文档对象的一个新实例,用来构建DOM树。public Document parse(File f) throws SAXException, IOException解析给定的XML文档f,返回DOM文档对象。3. Document类类public interface Document extends NodeDocument接口代表整个XML文档。public Element createElement(String tagName) throws DOMException创建指定的类型的元素tagName。public Text createTextNode(String data
18、)使用给定的data字符串创建节点元素的值。 4. Element类类 public interface Element extends Node Element接口代表XML文档中的一个元素。 public NodeList getElementsByTagName(String name) 返回给定的name元素下面的所有节点列表,以前向遍历的方式给出。5. NodeList类类NodeList接口给出一个节点集合,有以下两个方法:public int getLength()返回节点的个数。public Node item(int index)返回第index个节点。 6. Node类类
19、Node接口是整个文档对象模型中最主要的数据类型,它表示文档树中单一的节点。 Node getFirstChild() 返回节点的第一个孩子节点。 String getNodeValue() 返回叶子节点的值。14.3.3 实例实例 【例14.2】在用户界面(见图14.5)上输入个人信息后,单击“确定”按钮,程序收集用户信息,存成文档user.xml并显示如下。单击“显示”按钮,读取user.xml文件,将节点标签和对应的节点值显示在文本区域内。王军队海纳百川,有容乃大;壁立千仞,无欲则刚1. 程序源文件程序源文件/程序文件名UsePanel.javai
20、mport java.awt.*;import java.awt.event.*;import java.applet.*;import java.applet.Applet;import java.io.*;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.dom.*;public class UsePanel extends Applet implements ActionListenerLabel lblName,lblNumber
21、,lblSex,lblJob,lblText;TextField tfName,tfNumber;Checkbox chMale, chFemale;CheckboxGroup c;TextArea taText;Choice chJob;Button btnOk,btnDisplay;Panel p1,p2,p3,p4,p5,p6,p7,p8,p9;String strName,strNumber,strSex,strJob,strText;public void init()/初始化界面对象lblName = new Label(姓名:);lblNumber = new Label(身份证
22、号:);lblSex = new Label(性别);lblJob = new Label(职业);lblText = new Label(个性化宣言:);tfName = new TextField(23);tfNumber = new TextField(20);taText = new TextArea(10,20);c = new CheckboxGroup();chMale = new Checkbox(男,c,true);chFemale = new Checkbox(女,c,false);chJob = new Choice();chJob.add(计算机业);chJob.add
23、(医生);chJob.add(教师);chJob.add(军队);btnOk = new Button(确定);btnDisplay = new Button(显示);p1 = new Panel();p2 = new Panel();p3 = new Panel();p4 = new Panel();p5 = new Panel();p6 = new Panel();p7 = new Panel(new BorderLayout();p8 = new Panel();p9 = new Panel(new BorderLayout(); /设置界面 p1.add(lblName);p1.add
24、(tfName);p2.add(lblNumber);p2.add(tfNumber);p3.add(lblSex);p3.add(chMale);p3.add(chFemale);p4.add(lblJob);p4.add(chJob);p5.add(p3);p5.add(p4);p6.setLayout(new BorderLayout();p6.add(p1,BorderLayout.NORTH);p6.add(p2,BorderLayout.CENTER);p6.add(p5,BorderLayout.SOUTH);p7.add(lblText,BorderLayout.NORTH);
25、p7.add(taText,BorderLayout.CENTER);p8.setLayout(new FlowLayout(FlowLayout.CENTER,30,10);p8.add(btnOk);p8.add(btnDisplay);p9.add(p6,BorderLayout.NORTH);p9.add(p7,BorderLayout.CENTER);p9.add(p8,BorderLayout.SOUTH);add(p9);/添加监听事件btnOk.addActionListener(this);btnDisplay.addActionListener(this);btnDispl
26、ay.setEnabled(false);strName = new String();strNumber = new String();strSex = new String();strJob = new String();strText = new String();public void actionPerformed(ActionEvent evt)String arg = evt.getActionCommand(); /收集用户信息并写入XML文件if(arg.equals(确定)strName = tfName.getText().trim();strNumber = tfNum
27、ber.getText().trim();if(chMale.getState()strSex = 男;elsestrSex = 女;strJob = chJob.getSelectedItem();strText = taText.getText().trim();try /创建新的文档对象 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();DocumentBuilder db = dbf.newDocumentBuilder();Document doc = db.newDocument();/创建元素Ele
28、ment root = doc.createElement(UserData);Element eName = doc.createElement(Name);Element eNumber = doc.createElement(Number);Element eSex = doc.createElement(Sex);Element eJob = doc.createElement(Job);Element eText = doc.createElement(Text);/添加节点root.appendChild(eName);root.appendChild(eNumber);root.
29、appendChild(eSex);root.appendChild(eJob);root.appendChild(eText);/添加值eName.appendChild(doc.createTextNode(n + strName + n);eNumber.appendChild(doc.createTextNode(n + strNumber + n);eSex.appendChild(doc.createTextNode(n + strSex + n);eJob.appendChild(doc.createTextNode(n + strJob + n);eText.appendChi
30、ld(doc.createTextNode(n + strText + n);/创建文件对象File f = new File(user.xml);FileOutputStream fOut = new FileOutputStream(f);/初始化xml文件fOut.write(n.getBytes();/写入文件fOut.write(root.toString().getBytes();fOut.flush();fOut.close();btnDisplay.setEnabled(true);catch(Exception e)System.out.println(e.getMessag
31、e(); /读取XML文件并输出到文本区域else if(arg.equals(显示) try /得到XML文档对象 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document doc = db.parse(user.xml); Element root = doc.getDocumentElement(); /获取叶子节点值strName = root.getElementsByTagName(Name).item(0).getFirstChild().getNodeValue().trim();strNumber =root.getElementsByTagName(Number).item(0).getFirstChild(). getNodeValue().trim();strSex = root.getElementsByTagName(Sex).item(0).getFirstChild(). getNodeValue().trim();strJob = root.getElementsByTagName(Job).item(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 医院孤独症康复课件:《让孩子开说话 导读》
- 涂装后处理工中级模拟题及答案
- 高级中式面点师模拟题及答案
- (二模)2024~2025学年度苏锡常镇四市高三教学情况调研(二)地理试卷
- 纸张加工中的耐温性能优化技术考核试卷
- 航天器空间环境模拟与效应分析试题考核试卷
- 港口及航运设施工程项目的智能化运维考核试卷
- 船舶修理过程中材料性能检测考核试卷
- 船用卫星天气预报系统考核试卷
- 电子器件在远程医疗设备中的应用考核试卷
- 部编版语文一年级下册第六单元大单元教学任务群设计
- 12315投诉举报电话文明用语
- JJG 646-2006移液器
- JJF 1109-2003跳动检查仪校准规范
- GB/T 14211-2019机械密封试验方法
- GB 40161-2021过滤机安全要求
- BIM技术概述及应用介绍课件
- 部编小学语文六年级下册古诗词诵读(十首)课件
- 海洋工程装备-海洋油气资源开发装备课件
- 版式设计概述+设计原则课件
- 营业线施工安全知识培训讲义
评论
0/150
提交评论