




已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java解析XML编辑者:洋葱引用来源/blog/1012188/art/200903/117512.htm/link?url=JKEP_Z5D0HWgDW0kHYKpwRTU3tyGeLooE94744iYIAItwTKK2yQREqoqkLEEqez6QK9vGLWpH0AXTkF_ARWvLa一.XML解析方式1.DOM解析DOM的全称是Document Object Model,也即文档对象模型。在应用程序中,基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合(通常称DOM树),应用程序正是通过 对这个对象模型的操作,来实现对XML文档数据的操作。通过DOM接口,应用程序可以在任何时候访问XML文档中的任何一部分数据,因此,这种利用DOM 接口的机制也被称作随机访问机制。DOM接口提供了一种通过分层对象模型来访问XML文档信息的方式,这些分层对象模型依据XML的文档 结构形成了一棵节点树。无论XML文档中所描述的是什么类型的信息,即便是制表数据、项目列表或一个文档,利用DOM所生成的模型都是节点树的形式。也就 是说,DOM强制使用树模型来访问XML文档中的信息。由于XML本质上就是一种分层结构,所以这种描述方法是相当有效的。DOM树所提 供的随机访问方式给应用程序的开发带来了很大的灵活性,它可以任意地控制整个XML文档中的内容。然而,由于DOM分析器把整个XML文档转化成DOM树 放在了内存中,因此,当文档比较大或者结构比较复杂时,对内存的需求就比较高。而且,对于结构复杂的树的遍历也是一项耗时的操作。所以,DOM分析器对机 器性能的要求比较高,实现效率不十分理想。不过,由于DOM分析器所采用的树结构的思想与XML文档的结构相吻合,同时鉴于随机访问所带来的方便,因 此,DOM分析器还是有很广泛的使用价值的。2. SAX 解析SAX的全称是Simple APIs for XML,也即XML简单应用程序接口。与DOM不同,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式。当使用SAX分析器对 XML文档进行分析时,会触发一系列事件,并激活相应的事件处理函数,应用程序通过这些事件处理函数实现对XML文档的访问,因而SAX接口也被称作事件 驱动接口。二.使用Java 核心库解析XML/*1.DOM生成和解析XML文档为 XML 文档的已解析版本定义了一组接口。解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以使用 DOM 接口来操作这个树结构。优点:整个文档树在内存中,便于操作;支持删除、修改、重新排列等多种功能;缺点:将整个文档调入内存(包括无用的节点),浪费时间和空间;使用场合:一旦解析了文档还需多次访问这些数据;硬件资源充足(内存、CPU)。 对XML文档的操作1.获取/添加/修改/删除节点值2.获取/设置/修改/删除属性值3.层次遍历节点树*/public class DomDemo implements XmlDocument public static void main(String args)String fileName=book.xml;DomDemo dom=new DomDemo();dom.parserXml(fileName);dom.init();dom.createXml(book.out.xml);/文档对象private Document document; /*创建一个空的文档对象*/public void init() try /构建一个工厂DocumentBuilderFactory factory = DocumentBuilderFactory .newInstance(); /新建一个实例DocumentBuilder builder = factory.newDocumentBuilder(); /获取文档对象this.document = builder.newDocument(); catch (ParserConfigurationException e) System.out.println(e.getMessage(); /*创建一个XML文件*/public void createXml(String fileName) /创建一个元素,并作为根节点Element root = this.document.createElement(books); this.document.appendChild(root);/创建一个节点Element book = this.document.createElement(book); /创建一个子节点,并设置子节点的文本内容Element bookName = this.document.createElement(书名); bookName.appendChild(this.document.createTextNode(Java编程思想第4版); book.appendChild(bookName); Element price = this.document.createElement(定价); /设置属性price.setAttribute(单位, 元);price.appendChild(this.document.createTextNode(108.00); book.appendChild(price); /如上Element author = this.document.createElement(作者); author.setAttribute(性别, 男);author.appendChild(this.document.createTextNode(Bruce Eckel); book.appendChild(author);/如上Element isbnNo = this.document.createElement(ISBN编号); isbnNo.appendChild(this.document.createTextNode(9787111213826); book.appendChild(isbnNo);root.appendChild(book); /保存save(document,fileName, gbk); /*从文件解析XML文档*/public void parserXml(String fileName) try / 创建工厂,构建示例,加载文件,获取文档树对象DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();DocumentBuilder db = dbf.newDocumentBuilder();Document document = db.parse(fileName);/ 获取所有直接子节点NodeList books = document.getChildNodes();/ 遍历,第一层for (int i = 0; i books.getLength(); i+) Node book = books.item(i);System.out.println(book.getNodeName();NodeList bookInfo = book.getChildNodes();/ 遍历,第二层for (int j = 0; j bookInfo.getLength(); j+) Node node = bookInfo.item(j);System.out.println(t+node.getNodeName();NodeList bookMeta = node.getChildNodes();/ 遍历,第三层for (int k = 0; k + bookMeta.item(k).getNodeName() + :+ bookMeta.item(k).getTextContent();/ 输出示例 书名:Java编程思想第4版/* * 获取属性,而且可以设置属性 */NamedNodeMap map = bookMeta.item(k).getAttributes();if (map != null) for (int l = 0; l map.getLength(); l+) Node att = map.item(l);System.out.println( +att.getNodeName() + =+ att.getTextContent();/设置属性att.setTextContent(changed);/* * 通过输出结果我们可以发现,JAVA使用DOM解析时,与之间也是节点 */System.out.println(解析完毕);/将修改的结果保存save(document,fileName, gbk); catch (FileNotFoundException e) System.out.println(e.getMessage(); catch (ParserConfigurationException e) System.out.println(e.getMessage(); catch (SAXException e) System.out.println(e.getMessage(); catch (IOException e) System.out.println(e.getMessage(); public void save(Document document, String fileName, String encoding) /System.out.println(encoding=+document.getXmlEncoding();/ 实例化转换器工厂TransformerFactory tf = TransformerFactory.newInstance();try / 实例一个转换器Transformer transformer = tf.newTransformer();/ 构建一个文档源DOMSource source = new DOMSource(document);/ 设置字符编码transformer.setOutputProperty(OutputKeys.ENCODING, encoding);/ 设置缩排transformer.setOutputProperty(OutputKeys.INDENT, yes);PrintWriter pw = new PrintWriter(new FileOutputStream(fileName);StreamResult result = new StreamResult(pw);/ 通过转换器将文档树源写入文件transformer.transform(source, result);System.out.println(XML文件保存成功!); catch (TransformerConfigurationException e) System.out.println(e.getMessage(); catch (IllegalArgumentException e) System.out.println(e.getMessage(); catch (FileNotFoundException e) System.out.println(e.getMessage(); catch (TransformerException e) System.out.println(e.getMessage(); /*2.SAX生成和解析XML文档为解决DOM的问题,出现了SAX。SAX ,事件驱动。当解析器发现元素开始、元素结束、文本、文档的开始或结束等时,发送事件,程序员编写响应这些事件的代码,保存数据。优点:不用事先调入整个文档,占用资源少;SAX解析器代码比DOM解析器代码小,适于Applet,下载。缺点:不是持久的;事件过后,若没保存数据,那么数据就丢了;无状态性;从事件中只能得到文本,但不知该文本属于哪个元素;使用场合:Applet;只需XML文档的少量内容,很少回头访问;机器内存少; */public class SaxDemo implements XmlDocument public static void main(String args)SaxDemo demo=new SaxDemo();String fileName=book.out.xml;demo.parserXml(fileName);public void createXml(String fileName) System.out.println(); /解析public void parserXml(String fileName) /实例化一个工厂SAXParserFactory saxfac = SAXParserFactory.newInstance(); try /实例化一个解析器SAXParser saxparser = saxfac.newSAXParser(); InputStream is = new FileInputStream(fileName); /使用MySAXHandler处理文档saxparser.parse(is, new MySAXHandler(); catch (ParserConfigurationException e) e.printStackTrace(); catch (SAXException e) e.printStackTrace(); catch (FileNotFoundException e) e.printStackTrace(); catch (IOException e) e.printStackTrace(); public void save(Document document, String fileName, String encoding) / TODO Auto-generated method stub class MySAXHandler extends DefaultHandler boolean hasAttribute = false; Attributes attributes = null; /解析开始事件public void startDocument() throws SAXException System.out.println(文档解析开始); /解析结束事件public void endDocument() throws SAXException System.out.pri
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 河南对外经济贸易职业学院《舞蹈基础1》2023-2024学年第一学期期末试卷
- 郑州财经学院《文献检索与写作》2023-2024学年第一学期期末试卷
- 河南测绘职业学院《足球主项实践教学》2023-2024学年第一学期期末试卷
- 天津美术学院《广播电视节目策划》2023-2024学年第一学期期末试卷
- 浙江师范大学行知学院《音乐专业导论》2023-2024学年第一学期期末试卷
- 乐山职业技术学院《数字景观动画漫游与创作》2023-2024学年第一学期期末试卷
- 阿坝职业学院《书法鉴赏》2023-2024学年第一学期期末试卷
- 湖南九嶷职业技术学院《公共英语规培》2023-2024学年第一学期期末试卷
- 湖北铁道运输职业学院《烟草栽培育种学》2023-2024学年第一学期期末试卷
- 齐鲁医药学院《普通话》2023-2024学年第一学期期末试卷
- 期末试卷(五)(含答案含听力原文无听力音频)-2024-2025学年人教PEP版英语(新教材)三年级下册
- 湖南2024生地会考试卷及答案
- 广东省深圳市2024年中考英语真题(含答案)
- 叙事护理学智慧树知到答案2024年中国人民解放军海军军医大学
- 1379]国开电大本科《人文英语3》历年期末考试(第三大题阅读选择题)题库
- 六年级主题班队会记录表(6个表)
- 石家庄桥东污水处理厂三沟式氧化沟工艺设计
- 部编版六年级语文下册词语表(看拼音写词语)
- (完整版)煤矿主扇司机考试卷(含答案)
- 血液制品发展制约因素分析:基础薄弱起步晚
- 设计加热炉推料机传动装置
评论
0/150
提交评论