XML (二)
1 SAX
- 在使用DOM解析XML文档的时候,需要读取整个XML文档,在内存中构架代表整个DOM树的Document对象,从而再对XML文档进行操作。此种情况下,如果XML文档特别大,就会消耗计算机的大量内存,并且容易导致内存溢出。
- SAX解析允许在读取文档的时候,即对文档进行处理,而不必等到整个文档装载完才对文档进行操作。
- SAX采用事件处理的方式解析XML文件,利用SAX解析XML文档,涉及两个部分:解析器和事件处理器:
- 解析器可以使用JAXP的API创建,创建出SAX解析器后,就可以指定解析器去解析某个XML文档。
- 解析器采用SAX方式在解析某个XML文档的时候,它只要解析到XML文档的一个组成部分,都会去调用事件处理器的一个方法,解析器在调用事件处理器的方式时,会把当前解析到的xml文件内容作为方法的参数传递给事件处理器。
- 事件处理器由程序员编写,程序员通过事件处理器中方法的参数,就可以很轻松的得到SAX解析器解析到的数据,从而可以决定如何对数据进行处理。
- 示例:通过SAX解析xml文档,并将数据封装到javabean中
<?xml version="1.0" encoding="UTF-8" standalone="no"?><书架> <书> <书名>java从入门到放弃</书名> <作者>呵呵</作者> <售价>0.01</售价> </书> <书> <书名>c从入门到精通</书名> <作者>我好</作者> <售价>1.00</售价> </书> </书架>
package com; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.DefaultHandler; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import java.io.IOException; import java.util.ArrayList; import java.util.List; /** * 2017/10/28 * 说明: */ public class SAXDemo { public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException { List<Book> books = new ArrayList<>(); //使用SAXParserFactory创建SAX解析工厂 SAXParserFactory spf = SAXParserFactory.newInstance(); //通过SAX解析工厂得到解析对象 SAXParser sp= spf.newSAXParser(); //通过解析器对象得到一个XML的读取器 XMLReader xmlReader = sp.getXMLReader(); //设置读取器的事件处理器 xmlReader.setContentHandler(new DefaultHandler(){ private Book book = null; private String currentTagName;//当前读取的元素的名称 public void startElement (String uri, String localName, String qName, Attributes attributes) throws SAXException { if("书".equals(qName)){ book = new Book(); } currentTagName = qName; } public void endElement (String uri, String localName, String qName) throws SAXException { if("书".equals(qName)){ books.add(book);//读到书标记的结束,把书对象存起来 } currentTagName = null; } public void characters (char ch[], int start, int length) throws SAXException { if("书名".equals(currentTagName)){ book.setName(new String(ch,start,length)); } if("作者".equals(currentTagName)){ book.setAuthor(new String(ch,start,length)); } if("售价".equals(currentTagName)){ book.setPrice(new String(ch,start,length)); } } }); //解析xml文件 xmlReader.parse("D:\\code\\web\\src\\main\\webapp\\book.xml"); for(Book b:books){ System.out.println(b); } } }
2 DOM4j
- dom4j是一个简单、灵活的开发源代码的库。dom4j是由早起开发jdom的人分离出来而后独立开发的。与jdom不同的是,dom4j使用接口和抽象类,虽然dom4j的API相对复杂一些,但它提供了比jdom更好的灵活性。
- dom4j是一个非常优秀的java XML API,并且性能优异、功能强大和极其使用的特点。
2.1 Document对象
- 在dom4j中,获取Document对象的方式有三种:
- ①读取xml文件,获取Document对象
SAXReader reader = new SAXReader(); Document document = reader.read(new File("book.xml"));
- ②解析XML形式的文本,得到Document对象
String text = "<member></member>"; Document document = DocumentHelper.parseText(text);
- ③主动创建Document对象
Document document = DocumentHelper.createDocument(); Element root = document.addElement("member");
2.2 节点对象
- 获取文档的根节点
Element root = document.getRootElement();
- 获取某个节点的子节点
Element element=node.element(“书名");
- 获取节点的文本
String text=node.getText();
- 取得某个节点下的所有名为"member"的子接单,并进行遍历
List nodes = rootElm.elements("member"); for (Iterator it = nodes.iterator(); it.hasNext();) { Element elm = (Element) it.next(); // do something }
- 对某节点下的所有子节点遍历
for(Iterator it=root.elementIterator();it.hasNext();){ Element element = (Element) it.next(); // do something }
- 在某节点下添加子节点
Element ageElm = newMemberElm.addElement("age");
- 设置节点文字
element.setText("29");
- 删除某节点
parentElm.remove(childElm);
2.3 节点属性
- 获取某节点下的某个属性
Element root=document.getRootElement(); Attribute attribute=root.attribute("size");
- 获取属性的文字
String text = attribute.getText();
- 删除某属性
Attribute attribute=root.attribute("size"); root.remove(attribute);
- 遍历某节点的所有属性
Element root=document.getRootElement(); for(Iterator it=root.attributeIterator();it.hasNext();){ Attribute attribute = (Attribute) it.next(); String text=attribute.getText(); System.out.println(text); }
- 设置某节点的属性和文字
newMemberElm.addAttribute("name", "sitinspring");
- 设置属性的文字
Attribute attribute=root.attribute("name"); attribute.setText("sitinspring");
2.4 将文档写入xml文件
- 文档中全是英文,不设置编码,直接写入的形式
XMLWriter writer = new XMLWriter(new FileWriter("output.xml")); writer.write(document); writer.close();
- 文档中含有中文,设置编码格式写入的形式
OutputFormat format = OutputFormat.createPrettyPrint(); // 指定XML编码 format.setEncoding("UTF-8"); XMLWriter writer = new XMLWriter(new FileOutputStream ("output.xml"),format); writer.write(document); writer.close();
2.5 在指定位置插入节点
- ①得到插入位置的节点列表
- ②调用add(index,element),由index决定element的插入位置
- ③element元素可以通过DocumentHelper对象得到
- 示例:
Element aaa = DocumentHelper.createElement("aaa"); aaa.setText("aaa"); List list = root.element("书").elements(); list.add(1, aaa); //更新document
XML (二)的更多相关文章
- Java SE之XML<二>XML DOM与SAX解析
[文档整理系列] Java SE之XML<二>XML DOM与SAX解析 XML编程:CRUD(Create Read Update Delete) XML解析的两种常见方式: DOM(D ...
- JavaScript操作XML(二)
上一篇介绍了XML的结构以及节点之间的关系这一篇介绍浏览器内建的XML解析器以及JavaScript是如何加载XML的. 大多数浏览器都有读取和操作 XML 的内建 XML 解析器. 解析器(XML ...
- Hibernate映射文件详解(News***.hbm.xml)二
转自 http://blog.csdn.net/a9529lty/article/details/6454924 一.hibernate映射文件的作用: Hibernate映射文件是Hibernate ...
- 用javascript操作xml(二)JavaScript 将XML转换成字符串(xml to string)
function xmlToString(xmlData) { var xmlString; //IE if (window.ActiveXObject){ xmlString = xmlData.x ...
- Xml二(解析思想)、
XML解析: * 解析xml可以做: * 如果xml作为配置文件:读取 * 如果xml作为传输文件:写,读 * xml解析思想: * DOM:将文档加载进内存,形成一颗dom树(document对象) ...
- XML二
XML的语法要求: 1,XML文档必须有一个顶层元素,即文档元素,所有其他元素必须嵌入在文档元素中. 2,元素嵌套要正确,即如果一个元素在另一个元素中开始,那么必须在同一个元素中结束. 3,每个元素必 ...
- Android之使用XMLPull解析xml(二)
转自:http://www.blogjava.net/sxyx2008/archive/2010/08/04/327885.html 介绍下在Android中极力推荐的xmlpull方式解析xml.x ...
- XML介绍
XML [TOC] 1.XML简介 XML是Extend Markup Langue可扩展标签语言,标签由开发着自己定义 作用是: 1.描述带关系的数据(作为软件的配置文件):包含与被包含的关系 2. ...
- XML增、删、改
今天有个需求需要操作xml节点.突然见遗忘了许多.上网看了些资料.才整出来.脑袋真不够用.在这里把我找到的资料共享一下.方便以后使用.本文属于网摘/ 一.简单介绍 using System.Xml; ...
- JavaScript操作XML
JavaScript操作XML (一) JavaScript操作XML是通过XML DOM来完成的.那么什么是XML DOM呢?XML DOM 是: 用于 XML 的标准对象模型 用于 XML 的标准 ...
随机推荐
- SAP HANA中的SLT简介
在以SAP系统作为主要ERP的企业中,不同系统之间的数据库数据同步是个重要的工作.对于这种需求,除了开发ABAP接口之外,也有高效的工具可用.SLT就是其中之一. SLT是SAP的第一个ETL(Ext ...
- mysql foreign key(外键) 说明与实例
一,什么是foreign key,及其完整性 个人觉得,foreign key就是表与表之间的某种约定的关系,由于这种关系的存在,我们能够让表与表之间的数据,更加的完整,关连性更强.关于完整性,关连性 ...
- (2环境架设)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练 1综述http://www.cnblogs.com/jsxyhelu/p/7907241.html2环境架设http://www.cn ...
- PC端截取GIF图片的软件
PC端截取GIF图片的软件分享:下载>>
- swiper插件的简单使用,实现图片轮播
移动端和p c端经常会遇到写轮播图的情况,这里只是简单的说一下swiper插件的简单用法(移动端为例). <!DOCTYPE html> <html lang="en&qu ...
- 解析Linux中的VFS文件系统之文件系统的注册(二)
继上一篇文章:http://www.cnblogs.com/linhaostudy/p/7397024.html 3. 文件系统的注册 这里的文件系统是指可能会被挂载到目录树中的各个实际文件系统,所谓 ...
- 大数据Hadoop学习之了解Hadoop(1)
关于大数据,一看就懂,一懂就懵. 大数据的发展也有些年头了,如今正走在风口浪尖上,作为小白,我也来凑一份热闹. 大数据经过多年的发展,有着不同的实现方案和分支,不过,要说大数据实现方案中的翘楚,那就是 ...
- BZOJ 3670: [Noi2014]动物园【KMP变形 】
3670: [Noi2014]动物园 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 2738 Solved: 1475[Submit][Status ...
- mui 区域三级联动
<link href="../../css/mui.picker.css" rel="stylesheet" /><link href=&qu ...
- [国嵌攻略][119][Linux中断处理程序设计]
裸机中断: 1.中断统一入口. 2.注册中断处理程序. 3.根据中断源编号,调用中断处理程序. Linux中断 1.在entry-armv.S中的_irq_svc是中断统一入口. 2.获取产生中断源的 ...