博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java对XML文档的解析
阅读量:5227 次
发布时间:2019-06-14

本文共 6895 字,大约阅读时间需要 22 分钟。

 

1、 DOM解析

   DOM的全称是Document Object Model,也即文档对象模型。DOM解析会将XML文档以对象树的方式存入内存,因此,DOM解析内存消耗巨大。当然由于DOM解析将XML以节点树的方式调入内存,所以对文档进行增删改查(crud)比较方便。DOM分析器把整个XML文档转化成DOM树放在了内存中,因此,当文档比较大或者结构比较复杂时,对内存的需求就比较高。而且,对于结构复杂的树的遍历也是一项耗时的操作。所以,DOM分析器对机器性能的要求比较高,实现效率不十分理想。

-------------------------book.xml-----------------------------------------------
<书架>
<书>
<书名>
javaweb
<作者>
xiehe
<售价>
889.00元
<书>
<书名>
javaweb2
<作者>
hehe
<售价>
8.00元
------------------------------------------------------------------------------------package it.xiehe.xml;import java.io.FileOutputStream;import java.text.AttributedCharacterIterator.Attribute;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerFactory;import javax.xml.transform.dom.DOMSource;import javax.xml.transform.stream.StreamResult;import org.junit.Test;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.Node;import org.w3c.dom.NodeList;public class Demo02 { //1、读取xml文档内容 @Test public void read() throws Exception{ DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); DocumentBuilder builder=factory.newDocumentBuilder(); Document document=builder.parse("src/it/xiehe/xml/book.xml"); NodeList list=document.getElementsByTagName("书名"); Node node= list.item(0); String content= node.getTextContent(); System.out.println(content); } //递归遍历节点 @Test public void read1() throws Exception{ DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); DocumentBuilder builder=factory.newDocumentBuilder(); Document document=builder.parse("src/it/xiehe/xml/book.xml"); Node node=document.getElementsByTagName("书架").item(0); list(node); } private void list(Node node) { System.out.println(node.getTextContent()); NodeList list=node.getChildNodes(); for(int i=0;i
57.00元 //1>创建节点 Element piece=document.createElement("售价"); piece.setTextContent("57.00元"); //2>把创建的节点挂到第一本书上 Element book=(Element) document.getElementsByTagName("书").item(0); book.appendChild(piece); //3将修改的xml文件回写 TransformerFactory tffactory=TransformerFactory.newInstance(); Transformer tf=tffactory.newTransformer(); tf.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/it/xiehe/xml/book.xml"))); }}

2、SAX解析

  SAX的全称是Simple APIs for XML,也即XML简单应用程序接口。与DOM不同,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式。当使用SAX分析器对XML文档进行分析时,会触发一系列事件,并激活相应的事件处理函数,应用程序通过这些事件处理函数实现对XML文档的访问,因而SAX接口也被称作事件驱动接口。

  需要注意的是,SAX解析XML文档时,空白不能忽略。

package it.xiehe.xml;import javax.xml.parsers.ParserConfigurationException;import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import javax.xml.transform.sax.SAXTransformerFactory; import org.junit.Test; import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; import org.xml.sax.Locator; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; public class DemoSAX { @Test public void test01() throws Exception, Exception { // 1 创建sax工厂 SAXParserFactory factory = SAXParserFactory.newInstance(); // 2 得到解析器 SAXParser parser = factory.newSAXParser(); // 3 得到读取器 XMLReader reader = parser.getXMLReader(); // 4 设置内容处理器 // 不同的功能对应不同的处理器,一般通过继承DefaultHandler覆盖其中的方法 reader.setContentHandler(new ListHandler()); // 5 读取xml文件内容 reader.parse("src/Book.xml"); } } //1、打印出xml文件所有内容 //通过实现ContentHandler接口对XML文档进行处理 class ListHandler implements ContentHandler{ @Override public void setDocumentLocator(Locator locator) { // TODO Auto-generated method stub } @Override public void startDocument() throws SAXException { // TODO Auto-generated method stub } @Override public void endDocument() throws SAXException { // TODO Auto-generated method stub } @Override public void startPrefixMapping(String prefix, String uri) throws SAXException { // TODO Auto-generated method stub } @Override public void endPrefixMapping(String prefix) throws SAXException { // TODO Auto-generated method stub } @Override public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException { //这里对获取到的元素进行处理,暂时先输出吧! System.out.println("<"+qName+">"); for(int i=0;atts!=null&&i
<"+qName+">"); } @Override public void characters(char[] ch, int start, int length) throws SAXException { // TODO Auto-generated method stub System.out.println(new String(ch,start,length)); } @Override public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException { // TODO Auto-generated method stub } @Override public void processingInstruction(String target, String data) throws SAXException { // TODO Auto-generated method stub } @Override public void skippedEntity(String name) throws SAXException { // TODO Auto-generated method stub }} -------------------------------获得XML文档数据并且封装到对象中---------------------- package it.xiehe.xml; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import javax.xml.transform.sax.SAXTransformerFactory; import org.junit.Test; import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; import org.xml.sax.Locator; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.DefaultHandler; public class Demo03SAX { @Test public void test01() throws Exception, Exception { // 1 创建sax工厂 SAXParserFactory factory = SAXParserFactory.newInstance(); // 2 得到解析器 SAXParser parser = factory.newSAXParser(); // 3 得到读取器 XMLReader reader = parser.getXMLReader(); // 4 设置内容处理器 BeanListHandler handler=new BeanListHandler(); reader.setContentHandler(handler); // 5 读取xml文件内容 reader.parse("src/it/xiehe/xml/book.xml"); List
list=handler.getBook(); for(book b:list){ System.out.println(b); } } } // 3、打印出xml文件所有内容用book对象封装 //这里通过继承DefaultHandler类覆盖里面我们需要的方法实现想要的功能 class BeanListHandler extends DefaultHandler { private String TagContent;//记录标签内容 private book b;// List list = new ArrayList();//存储book对象 @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { TagContent = qName; if ("书".equals(TagContent)) { b = new book(); } } public List getBook() { return list; } @Override public void characters(char[] ch, int start, int length) throws SAXException { if ("书名".equals(TagContent)) { String name =

转载于:https://www.cnblogs.com/he-shao/p/5347635.html

你可能感兴趣的文章
三人行有我师?取长补短?影响力?
查看>>
设计模式——设计模式概述
查看>>
封装一个获取module.exports内容的方法
查看>>
动态连接库
查看>>
ServletContext 与application的异同
查看>>
水平垂直居中
查看>>
CSS3教程:border-image属性
查看>>
asp.netmvc常见功能链接
查看>>
sql server系统表详细说明
查看>>
SQL Server 2008连接字符串写法大全
查看>>
sql server 使用链接服务器远程查询
查看>>
JavaScript中的继承
查看>>
MySQL简介
查看>>
设计模式之桥接模式(Bridge)
查看>>
转:探讨跨域请求资源的几种方式
查看>>
jquery的$(document).ready()和onload的加载顺序
查看>>
Python Web框架Django (五)
查看>>
.net学习之继承、里氏替换原则LSP、虚方法、多态、抽象类、Equals方法、接口、装箱拆箱、字符串------(转)...
查看>>
Android 开发 ThreadPool(线程池) 总结
查看>>
【poj1568】 Find the Winning Move
查看>>