Java XML解析
2016-04-18 21:59
567 查看
Java XML解析
DOM解析
DOM(Document Object Model,文档对象模型)。优点:将XML文档转换成一个对象模型集合,可以在任何时候访问XML文档中的任何一部分数据
缺点:当文档比较大或者结构比较复杂时,对内存的需求就比较高。
DOM解析有4个核心的操作接口:
Document:此接口代表整个XML文档,表示整颗DOM树的根。
Node:每一个Node接口代表了DOM树种的一个节点
NodeList:此接口表示一个节点的集合
NamedNodeMap:表示一组节点和其唯一名称对应的一一对应关系。主要用于属性节点的表示。
DOM解析步骤
建立
DocumentBuilderFactory:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
建立
DocumentBuilder:
DocumentBuilder db = dbf.newDocumentBuilder();
建立
Document:
Document document = db.parse("要读取的文件路径");
建立
NodeList:
NodeList nl = document.getElementsByTagName("读取节点");
进行XML信息读取
//创建一个DocumentdBuilderFactory的对象 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); try { //创建一个DocumentBuilder对象 DocumentBuilder db = dbf.newDocumentBuilder(); //通过DocumentBuilder的parse方法解析books.xml文件 Document document = db.parse("books.xml"); //获取book节点的集合 NodeList bookList = document.getElementsByTagName("book"); //遍历每一个book节点 for(int i=0; i <bookList.getLength(); i++) { /* //通过item(i)方法获取一个book节点,nodelist的索引值从0开始 Node book = bookList.item(i); //获取book节点的所有属性值 NamedNodeMap attrs = book.getAttributes(); //遍历 for(int j=0; j < attrs.getLength(); j++) { //获取属性 Node attr = attrs.item(j); System.out.println("属性名:"+attr.getNodeName()+"属性值:"+attr.getNodeValue()); } */ /* * 前提:已经知道book节点有且只能有1个id属性 * 将book节点进行强制类型转换,转换成Element类型 */ Element book = (Element)bookList.item(i); String attrValue = book.getAttribute("id"); System.out.println("id->"+attrValue); System.out.println("======="); } } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException | IOException e) { e.printStackTrace(); }
DOM XML文件输出
如果要将XML文件,保存在硬盘山,需要使用到的类:
TransformerFactory 获取一个Transformer类的实例对象
Transformer
DOMSource 接收Document对象
StreamResult 指定要使用的输出流对象(可以向文件输出,也可以向指定的输出流输出)
//建立DocumentBuilderFactory,用于获取DocumentBuilder DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); //通过DocumentBuilderFactory取得DocumentBuilder DocumentBuilder builder = null; try { builder = factory.newDocumentBuilder(); } catch (Exception e) { e.printStackTrace(); } //定义Document接口对象,通过DocumentBuilder类进行DOM树的转换操作 Document doc = null; doc = builder.newDocument(); //建立各个操作节点 Element addresslist = doc.createElement("addresslist"); Element linkman = doc.createElement("linkman"); Element name = doc.createElement("name"); Element email = doc.createElement("email"); //设置节点的文本内容 name.appendChild(doc.createTextNode("张三")); email.appendChild(doc.createTextNode("zhangsan@123.com")); //设置节点关系 linkman.appendChild(name); linkman.appendChild(email); addresslist.appendChild(linkman); doc.appendChild(addresslist); //输出文档到文件中 TransformerFactory tf = TransformerFactory.newInstance(); Transformer t = null; try { t = tf.newTransformer(); } catch (Exception e) { e.printStackTrace(); } t.setOutputProperty(OutputKeys.ENCODING, "UTF-8");//设置编码 DOMSource source = new DOMSource(doc);//输出文档 StreamResult result = new StreamResult(new File("output.xml")); try { t.transform(source, result);//输出 } catch (Exception e) { e.printStackTrace(); }
最终创建的xml文件内容如下:
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <addresslist> <linkman> <name>张三</name> <email>zhangsan@123.com</email> </linkman> </addresslist>
SAX解析
SAX(Simple APIs for XML,操作XML的简单接口),与DOM操作不同,SAX采用的是一种顺序的模式进行访问,是一种快速读取XML数据的方式。使用SAX解析器进行操作时会触发一系列事件。如何使用SAX解析?
1. 编写一个
SAX解析器,该类继承自
DefaultHandler
package com.imooc.test; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; //定义SAX解析器 public class MySAX extends DefaultHandler { //文档开始 @Override public void startDocument() throws SAXException { System.out.println("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>"); } //文档结束 @Override public void endDocument() throws SAXException { System.out.println("\n 文档读取结束..."); } //元素开始 @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { System.out.println("<"); System.out.println(qName);//输出元素名称 if(attributes != null){//取得全部的属性 for (int i = 0; i < attributes.getLength(); i++) { System.out.println(" "+attributes.getQName(i)+"=\"" +attributes.getValue(i)+"\" "); } } System.out.println(">"); } //取出元素内容 @Override public void characters(char[] ch, int start, int length) throws SAXException { System.out.println(new String(ch,start, length)); } //元素结束 @Override public void endElement(String uri, String localName, String qName) throws SAXException { System.out.println("</"); System.out.println(qName); System.out.println(">"); } }
还需要
SAXParserFactory和
SAXParser类
//建立SAX解析工厂 SAXParserFactory factory = SAXParserFactory.newInstance(); //构建解析器 SAXParser parser = factory.newSAXParser(); //解析XML使用HANDLER parser.parse("books.xml", new MySAX());
DOM解析与SAX解析的区别
JDOM
JDOM=DOM修改文件的优点+SAX读取快速的优点DOM4J
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序