XML 的解析方法
四种XML解析方法:
(1)Dom生成和解析XML文档
*解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以使用 DOM 接口来操作这个树结构。
* 优点:整个文档树在内存中,便于操作;支持删除、修改、重新排列等多种功能;
* 缺点:将整个文档调入内存(包括无用的节点),浪费时间和空间;
* 使用场合:一旦解析了文档还需多次访问这些数据;硬件资源充足(内存、CPU)。
(2)SAX生成和解析XML文档
* SAX ,事件驱动。
* 当解析器发现元素开始、元素结束、文本、文档的开始或结束等时,发送事件,程序员编写响应这些事件的代码,保存数据。
* 优点:不用事先调入整个文档,占用资源少;SAX解析器代码比DOM解析器代码小,适于Applet,下载。
* 缺点:不是持久的;事件过后,若没保存数据,那么数据就丢了;
* 无状态性;从事件中只能得到文本,但不知该文本属于哪个元素;
* 使用场合:Applet;只需XML文档的少量内容,很少回头访问;机器内存少;
(3)DOM4J生成和解析XML文档
* DOM4J 是一个非常非常优秀的Java XML API,
* 具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。
* 如今你可以看到越来越多的 Java 软件都在使用 DOM4J 来读写 XML,特别值得一提的是连 Sun 的 JAXM 也在用 DOM4J。
(4)JDOM生成和解析XML
*为减少DOM、SAX的编码量,出现了JDOM;
*优点:20-80原则,极大减少了代码量。
*使用场合:要实现的功能简单,如解析、创建等,
*但在底层,JDOM还是使用SAX(最常用)、DOM、Xanan文档。
首先编写一个要解析的test.xml文件
- <?xml version="1.0" encoding="UTF-8" standalone="no"?>
- <employees>
- <employee>
- <name>wxyfree</name>
- <age>30</age>
- </employee>
- <employee>
- <name>freewxy</name>
- <age>22</age>
- </employee>
- </employees>
然后,编写一个XMLDocument接口
- /**
- * 定义XML文档建立与解析的接口
- * @author wxy
- *
- */
- public interface XMLDocument {
- /**
- *建立XML文档
- * @param fileName 文件全路径名
- */
- public void createXML(String fileName);
- /**
- * 解析XML文档
- * @param fileName 文件全路径名
- */
- public void parseXML(String fileName);
- }
一、
- package review.testXML;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.PrintWriter;
- import javax.xml.parsers.DocumentBuilder;
- import javax.xml.parsers.DocumentBuilderFactory;
- import javax.xml.parsers.ParserConfigurationException;
- import javax.xml.transform.OutputKeys;
- import javax.xml.transform.Transformer;
- import javax.xml.transform.TransformerConfigurationException;
- import javax.xml.transform.TransformerException;
- import javax.xml.transform.TransformerFactory;
- import javax.xml.transform.dom.DOMSource;
- import javax.xml.transform.stream.StreamResult;
- import org.w3c.dom.Document;
- import org.w3c.dom.Element;
- import org.w3c.dom.Node;
- import org.w3c.dom.NodeList;
- import org.xml.sax.SAXException;
- /**
- * Dom生成和解析XML文档
- * 为 XML 文档的已解析版本定义了一组接口。
- * 解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以使用 DOM 接口来操作这个树结构。
- * 优点:整个文档树在内存中,便于操作;支持删除、修改、重新排列等多种功能;
- * 缺点:将整个文档调入内存(包括无用的节点),浪费时间和空间;
- * 使用场合:一旦解析了文档还需多次访问这些数据;硬件资源充足(内存、CPU)。
- * @param args
- */
- public class DomDemo implements XMLDocument {
- private Document document;
- private String fileName;
- public void init(){
- try{
- DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
- DocumentBuilder builder=factory.newDocumentBuilder();
- this.document=builder.newDocument();
- }catch(ParserConfigurationException e){
- System.out.println(e.getMessage());
- }
- }
- @Override
- public void createXML(String fileName) {
- Element root=this.document.createElement("employees");//创建根元素
- this.document.appendChild(root);
- Element employee=this.document.createElement("employee");//创建子元素
- Element name=this.document.createElement("name");//添加元素的属性
- name.appendChild(this.document.createTextNode("wxyfree"));
- employee.appendChild(name);//将元素添加到子元素中
- Element sex=this.document.createElement("sex");
- sex.appendChild(this.document.createTextNode("m"));
- Element age=this.document.createElement("age");
- age.appendChild(this.document.createTextNode("30"));
- employee.appendChild(age);
- root.appendChild(employee);//将子元素添加到根元素中
- TransformerFactory tf=TransformerFactory.newInstance();//此抽象类的实例能够将源树转为结果树
- try{
- Transformer transformer=tf.newTransformer();
- DOMSource source=new DOMSource(document);//创建带有DOM节点的新输入源
- transformer.setOutputProperty(OutputKeys.ENCODING,"UTF-8");//设置转换中世纪的输出属性
- transformer.setOutputProperty(OutputKeys.INDENT, "yes");//
- PrintWriter pw=new PrintWriter(new FileOutputStream(fileName));
- StreamResult result=new StreamResult(pw);//充当转换结果的持有者,可以为xml、纯文本、HTML或某些其他格式的标记
- transformer.transform(source, result);//将XML Source转换为Result
- System.out.println("生成XML文件成功");
- }catch(TransformerConfigurationException e){
- System.out.println(e.getMessage());
- } catch (TransformerException e) {
- System.out.println(e.getMessage());
- } catch (FileNotFoundException e) {
- System.out.println(e.getMessage());
- }
- }
- @Override
- public void parseXML(String fileName) {
- DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
- DocumentBuilder db;
- try {
- db = dbf.newDocumentBuilder();
- Document document = db.parse(fileName);
- NodeList employees=document.getChildNodes();
- for(int i=0;i<employees.getLength();i++){
- Node employee=employees.item(i);
- NodeList employeeInfo=employee.getChildNodes();
- for(int j=0;j<employeeInfo.getLength();j++){
- Node node=employeeInfo.item(j);
- NodeList employeeMeta=node.getChildNodes();
- for(int k=0;k<employeeMeta.getLength();k++){
- System.out.println(employeeMeta.item(k).getNodeName()+":"+employeeMeta.item(k).getTextContent());
- }
- }
- }
- } catch (ParserConfigurationException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (SAXException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- System.out.println("解析完毕");
- }
- public static void main(String[] args){
- DomDemo d=new DomDemo();
- d.init();
- d.createXML("conf/test2.xml");
- d.parseXML("conf/test.xml");
- }
- }
二、
- package review.testXML;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.IOException;
- import java.io.InputStream;
- import javax.xml.parsers.ParserConfigurationException;
- import javax.xml.parsers.SAXParser;
- import javax.xml.parsers.SAXParserFactory;
- import org.xml.sax.Attributes;
- import org.xml.sax.HandlerBase;
- import org.xml.sax.SAXException;
- import org.xml.sax.helpers.DefaultHandler;
- /**
- * SAX ,事件驱动。
- * 当解析器发现元素开始、元素结束、文本、文档的开始或结束等时,发送事件,程序员编写响应这些事件的代码,保存数据。
- * 优点:不用事先调入整个文档,占用资源少;SAX解析器代码比DOM解析器代码小,适于Applet,下载。
- * 缺点:不是持久的;事件过后,若没保存数据,那么数据就丢了;
- * 无状态性;从事件中只能得到文本,但不知该文本属于哪个元素;
- * 使用场合:Applet;只需XML文档的少量内容,很少回头访问;机器内存少;
- * @author wxy
- *
- */
- public class SaxDemo implements XMLDocument{
- @Override
- public void createXML(String fileName) {
- System.out.println("<<"+fileName+">>");
- }
- @Override
- public void parseXML(String fileName) {
- SAXParserFactory saxfac=SAXParserFactory.newInstance();
- try {
- SAXParser saxParser=saxfac.newSAXParser();
- InputStream ins=new FileInputStream(fileName);
- saxParser.parse(ins,new MySAXHandler());
- } catch (ParserConfigurationException e) {
- System.out.println(e.getMessage());
- } catch (SAXException e) {
- System.out.println(e.getMessage());
- } catch (FileNotFoundException e) {
- System.out.println(e.getMessage());
- } catch (IOException e) {
- System.out.println(e.getMessage());
- }
- }
- /**
- * @param args
- */
- public static void main(String[] args) {
- SaxDemo s=new SaxDemo();
- s.parseXML("conf/test.xml");
- }
- }
- class MySAXHandler extends DefaultHandler{
- boolean hasAttribute=false;
- Attributes attributes=null;
- /**
- * Receive notification of the beginning of the document.
- */
- public void startDocument()throws SAXException{
- System.out.print("文档开始打印了");
- }
- /**
- * Receive notification of the end of the document.
- */
- public void endDocument()throws SAXException{
- System.out.print("文档开始结束了");
- }
- /**
- * Receive notification of the start of an element.
- * @param uri The Namespace URI, or the empty string if the
- * element has no Namespace URI or if Namespace
- * processing is not being performed.
- * @param localName The local name (without prefix), or the
- * empty string if Namespace processing is not being
- * performed.
- * @param qName The qualified name (with prefix), or the
- * empty string if qualified names are not available.
- * @param attributes The attributes attached to the element. If
- * there are no attributes, it shall be an empty
- * Attributes object.
- * @exception org.xml.sax.SAXException Any SAX exception, possibly
- * wrapping another exception.
- */
- public void startElement(String uri,String localName,String qName,Attributes attributes)throws SAXException{
- if(qName.equals("employees")){return;}
- if(qName.equals("employee")){
- System.out.print(qName);
- }
- if(attributes.getLength()>0){
- this.attributes=attributes;
- this.hasAttribute=true;
- }
- }
- /**
- * Receive notification of the end of an element.
- * @param uri The Namespace URI, or the empty string if the
- * element has no Namespace URI or if Namespace
- * processing is not being performed.
- * @param localName The local name (without prefix), or the
- * empty string if Namespace processing is not being
- * performed.
- * @param qName The qualified name (with prefix), or the
- * empty string if qualified names are not available.
- * @exception org.xml.sax.SAXException Any SAX exception, possibly
- * wrapping another exception.
- */
- public void endElement(String uri,String localName,String qNaqme)throws SAXException{
- if(hasAttribute&&(attributes!=null)){
- for(int i=0;i<attributes.getLength();i++){
- System.out.print(attributes.getQName(0)+attributes.getValue(0));
- }
- }
- }
- /**
- * Receive notification of character data inside an element.
- * @param ch The characters.
- * @param start The start position in the character array.
- * @param length The number of characters to use from the
- * character array.
- */
- public void characters(char[] ch,int start,int length)throws SAXException{
- System.out.print(new String(ch,start,length));
- }
- }
三、
- package review.testXML;
- import java.io.File;
- import java.io.FileWriter;
- import java.io.IOException;
- import java.io.Writer;
- import java.util.Iterator;
- import org.dom4j.Document;
- import org.dom4j.DocumentException;
- import org.dom4j.DocumentHelper;
- import org.dom4j.Element;
- import org.dom4j.io.SAXReader;
- import org.dom4j.io.XMLWriter;
- /**
- * Dom4j 生成XML文档与解析XML文档
- * DOM4J 是一个非常非常优秀的Java XML API,
- * 具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。
- * 如今你可以看到越来越多的 Java 软件都在使用 DOM4J 来读写 XML,特别值得一提的是连 Sun 的 JAXM 也在用 DOM4J。
- * @author wxy
- *
- */
- public class Dom4jDemo implements XMLDocument{
- @Override
- public void createXML(String fileName) {
- Document document = DocumentHelper.createDocument();
- Element employees=document.addElement("employees");
- Element employee=document.addElement("employee");
- Element name=employee.addElement("name");
- name.setText("wxy");
- Element sex=employee.addElement("sex");
- name.setText("f");
- Element age=employee.addElement("age");
- name.setText("29");
- try {
- Writer fileWriter=new FileWriter(fileName);
- XMLWriter xmlWriter=new XMLWriter(fileWriter);
- xmlWriter.write(document);
- xmlWriter.close();
- } catch (IOException e) {
- System.out.println(e.getMessage());
- }
- }
- @Override
- public void parseXML(String fileName) {
- File inputXML=new File(fileName);
- SAXReader saxReader=new SAXReader();
- try {
- Document document=saxReader.read(inputXML);
- Element employees=document.getRootElement();
- for(Iterator i=employees.elementIterator();i.hasNext();){
- Element employee=(Element)i.next();
- for(Iterator j=employee.elementIterator();j.hasNext();){
- Element node=(Element)j.next();
- System.out.println(node.getName()+":"+node.getText());
- }
- }
- } catch (DocumentException e) {
- System.out.println(e.getMessage());
- }
- System.out.println("dom4j parserXML");
- }
- public static void main(String[] args) {
- Dom4jDemo d=new Dom4jDemo();
- d.parseXML("conf/test.xml");
- }
- }
四、
- package review.testXML;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.util.List;
- import org.jdom.Document;
- import org.jdom.Element;
- import org.jdom.JDOMException;
- import org.jdom.input.SAXBuilder;
- import org.jdom.output.XMLOutputter;
- /**
- * JDOM生成和解析XML
- *为减少DOM、SAX的编码量,出现了JDOM;
- *优点:20-80原则,极大减少了代码量。
- *使用场合:要实现的功能简单,如解析、创建等,
- *但在底层,JDOM还是使用SAX(最常用)、DOM、Xanan文档。
- * @author wxy
- *
- */
- public class JDomDemo implements XMLDocument{
- @Override
- public void createXML(String fileName) {
- Document document;
- Element root;
- root=new Element("employees");
- document=new Document(root);
- Element employee=new Element("employee");
- root.addContent(employee);
- Element name=new Element("name");
- name.setText("wxywxy");
- employee.addContent(name);
- Element sex=new Element("sex");
- sex.setText("m");
- employee.addContent(sex);
- Element age=new Element("age");
- age.setText("25");
- employee.addContent(age);
- XMLOutputter XMLOut=new XMLOutputter();
- try {
- XMLOut.output(document, new FileOutputStream(fileName));
- } catch (FileNotFoundException e) {
- System.out.println(e.getMessage());
- } catch (IOException e) {
- System.out.println(e.getMessage());
- }
- }
- @Override
- public void parseXML(String fileName) {
- SAXBuilder builder=new SAXBuilder(false);
- try {
- Document document=builder.build(fileName);
- Element employees=document.getRootElement();
- List employeeList=employees.getChildren("employee");
- for(int i=0;i<employeeList.size();i++){
- Element employee=(Element)employeeList.get(i);
- List employeeInfo=employee.getChildren();
- for(int j=0;j<employeeInfo.size();j++){
- System.out.println(((Element)employeeInfo.get(j)).getName()+":"+((Element)employeeInfo.get(j)).getText());
- }
- }
- } catch (JDOMException e) {
- System.out.println(e.getMessage());
- } catch (IOException e) {
- System.out.println(e.getMessage());
- }
- }
- public static void main(String[] args){
- JDomDemo jd=new JDomDemo();
- jd.parseXML("conf/test.xml");
- }
- }
XML 的解析方法的更多相关文章
- 八、Android学习第七天——XML文件解析方法(转)
(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 八.Android学习第七天——XML文件解析方法 XML文件:exten ...
- XStream的使用方法、简单使用方法、xml的解析方法
下面介绍的是在Android Studio中的使用 Android Studio中目前支持的Xstream最高版本是xstream-1.4.7.jar,大家可以在网上下载,我的是在开源中国项目中有这个 ...
- 又一种XML的解析方法
[Fact(DisplayName="用户名为空")] public void Should_UsernameEmpty() { var paras = new Dictionar ...
- XML解析之DOM详解及与SAX解析方法的比较
XML解析(DOM) XML文件解析方法介绍 我们所用到的NSXMLParser是采用SAX方法解析 SAX(Simple API for XML) 只能读,不能修改,只能顺序访问,适合解析大型XML ...
- JAVA 中XML的解析
XML: 可扩展标记语言(extensible Markup Language) 用于标记电子文件使其具有结构性的标记语言.XML可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定 ...
- Java解析XML三种常用方法
1.使用DOM方式解析: package com.wzh.dom; import java.util.Iterator; import javax.xml.parsers.DocumentBuilde ...
- DOM、SAX、JDOM、DOM4J四种XML解析方法PK
基础方法(指不需要导入jar包,java自身提供的解析方式):DOM.SAXDOM:是一种平台无关的官方解析方式 --优点: (1)形成了树结构,直观好理解,代码更易编写 ...
- 解析Xml四种方法
关键字:Java解析xml.解析xml四种方法.DOM.SAX.JDOM.DOM4j.XPath [引言] 目前在Java中用于解析XML的技术很多,主流的有DOM.SAX.JDOM.DOM4j,下文 ...
- XML的四种解析方法
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6646572.html XML文档以层级标签的形式来组织数据,多用于配置文件.存储静态数据.交换数据. ...
随机推荐
- php中变量引用&不可与global共同使用
问题来源,新公司debug. 程序中代码大致如下 class Ci { private static $instance = NULL; public $name = 'hello'; public ...
- activity通过流程实例id动态获取流程图并展示在jsp页面上
提供的Service方法如下: Java /** * 获取当前任务流程图 * * @param processInstanceId * @return */ @Override public Inpu ...
- hdu 5471(状压DP or 容斥)
想了最复杂的思路,用了最纠结的方法,花了最长的时间,蒙了一种规律然后莫名其妙的过了. MD 我也太淼了. 后面想了下用状压好像还是挺好写的,而且复杂度也不高.推出的这个容斥的规律也没完全想透我就CAO ...
- Instapaper 使用经验和技巧
Instapaper 分类本质是文件夹整理,没有标签. 文件夹意味着一篇文章只能放在一个文件夹里,不像标签可以实现一篇文章多个标签的功能. 一.文件夹和Like功能 1.已有文件夹: Home:存放所 ...
- Git使fork项目与源项目保持一致方法
Github上经常干的一件事情是看到好的项目,总会fork到自己的项目列表里,但是源项目如果更新了,怎么同步到我们自己的fork项目呢? 操作如下: 先clone自己的fork项目到本地工程目录, g ...
- JS replace()方法替换变量(可以对变量进行全文替换)
转至:http://blog.sina.com.cn/s/blog_6552200b0102ve60.html 事情是这样的: 我要用 JS 替换一个多行文本的关键字 正常,没有变量的时候应该是这样: ...
- MySQL版本与工具
MySQL各个版本区别 MySQL 的官网下载地址:http://www.mysql.com/downloads/ 在这个下载界面会有几个版本的选择. 1. MySQL Community Serve ...
- Django模型中OneToOneField和ForeignKey的区别
网上看到一篇讲解"Django模型中OneToOneField和ForeignKey区别" 的文章,浅显易懂; 可以把ForeignKey形象的类比为: ForeignKey是on ...
- python并发编程&协程
0x01 前导 如何基于单线程来实现并发? 即只用一个主线程(可利用的cpu只有一个)情况下实现并发: 并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操 ...
- 我的Android进阶之旅------>RGB颜色查询对照表
因为兼容性问题,色阶板功能只能在IE浏览器中运行 RGB颜色对照表 #FFFFFF #FFFFF0 #FFFFE0 #FFFF00 #FFFAFA #FFFAF0 #FFF ...