XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便。

XML在不同的语言里解析方式都是一样的,只不过实现的语法不同而已。

基本的解析方式有两种,一种叫SAX,另一种叫DOM。

SAX是基于事件流的解析,DOM是基于XML文档树结构的解析。

假设我们XML的内容和结构如下:

<?xml version="1.0" encoding="UTF-8"?>
<employees>
<employee>
<name>ddviplinux</name>
<sex>m</sex>
<age>30</age>
</employee>
</employees>

下面使用JAVA语言来实现DOM与SAX的XML文档生成与解析。

首先定义一个操作XML文档的接口XmlDocument 它定义了XML文档的建立与解析的接口。

package com.alisoft.facepay.framework.bean;
/**
*
* @author hongliang.dinghl
* 定义XML文档建立与解析的接口
*/
public interface XmlDocument {
/**
* 建立XML文档
* @param fileName 文件全路径名称
*/
public void createXml(String fileName);
/**
* 解析XML文档
* @param fileName 文件全路径名称
*/
public void parserXml(String fileName);
} 


1.DOM生成和解析XML文档

为 XML 文档的已解析版本定义了一组接口。解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以使用 DOM 接口来操作这个树结构。优点:整个文档树在内存中,便于操作;支持删除、修改、重新排列等多种功能;缺点:将整个文档调入内存(包括无用的节点),浪费时间和空间;使用场合:一旦解析了文档还需多次访问这些数据;硬件资源充足(内存、CPU)。

 package com.alisoft.facepay.framework.bean;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 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;
 /**
 *
 * @author hongliang.dinghl
 * DOM生成与解析XML文档
 */
 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());
 }
 }
 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("丁宏亮"));
 employee.appendChild(name);
 Element sex = this.document.createElement("sex");
 sex.appendChild(this.document.createTextNode("m"));
 employee.appendChild(sex);
 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);
 transformer.setOutputProperty(OutputKeys.ENCODING, "gb2312");
 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());
 }
 }
 public void parserXml(String fileName) {
 try {
 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
 DocumentBuilder 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());
 }
 }
 }
 System.out.println("解析完毕");
 } 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());
 }
 }
 } 

2.SAX生成和解析XML文档

使用SAXReader需要导入dom4j-full.jar包。

dom4j是一个Java的XML API,类似于jdom,用来读写XML文件的。dom4j是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。

使用举例:

 s.xml内容

<?xml version="1.0" encoding="GB2312"?>
<data>
    <row queryDTO.enterpriseId="gfd" queryDTO.loginName="gdfg" queryDTO.state="0"/>
</data>  

解析

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.dom4j.tree.AbstractAttribute;  

public class ReadXMLTest {  

    public static void main(String[] args){
        File xmlFile = new File("C:/s.xml");
        FileInputStream fis = null;
        try {
            fis = new FileInputStream(xmlFile);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            System.err.println("File is not exsit!");
        }  

        SAXReader saxReader = new SAXReader();
        List rowList = null;
        try {
            //生成文档对应实体
            Document doc = saxReader.read(fis);
            //获取指定路径下的元素列表,这里指获取所有的data下的row元素
            rowList = doc.selectNodes("//data/row");
        } catch (DocumentException e) {
            e.printStackTrace();
        }  

        for(Iterator iter = rowList.iterator();iter.hasNext();){
            //获得具体的row元素
            Element element = (Element)iter.next();
            //获得row元素的所有属性列表
            List elementList = element.attributes();
            for(Iterator iter1 = elementList.iterator();iter1.hasNext();){
                //将每个属性转化为一个抽象属性,然后获取其名字和值
                AbstractAttribute aa = (AbstractAttribute)iter1.next();
                System.out.println("Name:"+aa.getName()+";Value:"+aa.getValue());
            }
                            //输出:
                            //Name:queryDTO.enterpriseId;Value:gfd
                            //Name:queryDTO.loginName;Value:gdfg
                            //Name:queryDTO.state;Value:0
            System.out.println(element.getName());
                            //输出:
                            //row
            // 取得row元素的queryDTO.enterpriseId属性的值
            System.out.println(element.attributeValue("queryDTO.enterpriseId"));
                            //输出:
                            //gfd
            //如果element下有子元素,(类似width="**"),要想获得该子元素的值,可以用如下方法
            System.out.println(element.elementText("width"));//因为没有,所以输出为null。
        }  

    }
}  

3.DOM4J生成和解析XML文档

DOM4J 是一个非常非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件。如今你可以看到越来越多的 Java 软件都在使用 DOM4J 来读写 XML,特别值得一提的是连 Sun 的 JAXM 也在用 DOM4J。

Java代码

 package com.alisoft.facepay.framework.bean;
 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;
 /**
 *
 * @author hongliang.dinghl
 * Dom4j 生成XML文档与解析XML文档
 */
 public class Dom4jDemo implements XmlDocument {   

 public void createXml(String fileName) {
 Document document = DocumentHelper.createDocument();
 Element employees=document.addElement("employees");
 Element employee=employees.addElement("employee");
 Element name= employee.addElement("name");
 name.setText("ddvip");
 Element sex=employee.addElement("sex");
 sex.setText("m");
 Element age=employee.addElement("age");
 age.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());
 }   

 }   

 public void parserXml(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");
 }
 }    

4.JDOM生成和解析XML

为减少DOM、SAX的编码量,出现了JDOM;优点:20-80原则,极大减少了代码量。使用场合:要实现的功能简单,如解析、创建等,但在底层,JDOM还是使用SAX(最常用)、DOM、Xanan文档。

 package com.alisoft.facepay.framework.bean;   

 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;
 /**
 *
 * @author hongliang.dinghl
 * JDOM 生成与解析XML文档
 *
 */
 public class JDomDemo implements XmlDocument {   

 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("ddvip");
 employee.addContent(name);
 Element sex=new Element("sex");
 sex.setText("m");
 employee.addContent(sex);
 Element age=new Element("age");
 age.setText("23");
 employee.addContent(age);
 XMLOutputter XMLOut = new XMLOutputter();
 try {
 XMLOut.output(document, new FileOutputStream(fileName));
 } catch (FileNotFoundException e) {
 e.printStackTrace();
 } catch (IOException e) {
 e.printStackTrace();
 }   

 }   

 public void parserXml(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++){ <br="">Element employee=(Element)employeeList.get(i);
 List employeeInfo=employee.getChildren();
 for(int j=0;j<employeeinfo.size();j++){ <br="">System.out.println(((Element)employeeInfo.get(j)).getName()+":"+((Element)employeeInfo.get(j)).getValue());   

 }
 }
 } catch (JDOMException e) {   

 e.printStackTrace();
 } catch (IOException e) {   

 e.printStackTrace();
 }    

 }
 }   
  

Java 解析XML的几种方法的更多相关文章

  1. java解析xml的三种方法

    java解析XML的三种方法 1.SAX事件解析 package com.wzh.sax; import org.xml.sax.Attributes; import org.xml.sax.SAXE ...

  2. 【Java】详解Java解析XML的四种方法

    XML现在已经成为一种通用的数据交换格式,平台的无关性使得很多场合都需要用到XML.本文将详细介绍用Java解析XML的四种方法. AD: XML现在已经成为一种通用的数据交换格式,它的平台无关性,语 ...

  3. Java解析XML的四种方法详解 - 转载

    XML现在已经成为一种通用的数据交换格式,平台的无关性使得很多场合都需要用到XML.本文将详细介绍用Java解析XML的四种方法 在做一般的XML数据交换过程中,我更乐意传递XML字符串,而不是格式化 ...

  4. JAVA解析XML的四种方法

    XML文件:test.xml <?xml version="1.0" encoding="UTF-8"?> <employees> &l ...

  5. 详解Java解析XML的四种方法

    XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便.对于XML本身的语法知识与技术细节,需要阅读相关的技术文献,这里面包括的内容有DOM ...

  6. java解析XML文件四种方法之引入源文件

    1.DOM解析(官方) try { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();         Documen ...

  7. [转]详解Java解析XML的四种方法

    XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便.对于XML本身的语法知识与技术细节,需要阅读相关的技术文献,这里面包括的内容有DOM ...

  8. JAVA解析XML的几种方法

    DOM DOM Document Object Model 文档对象模型.在应用程序中,基于DOM的解析器将一个XML文档转换成一个对象模型的集合(DOM树),应用程序正是通过对这个对象模型的操作,来 ...

  9. 解析XML的几种方法之SAX解析

    假期总结不能停,坚持坚持....接下来总结一下XMl和json的解析和生成.. 解析XML的四种方法,即:DOM.SAX.JDOM和DOM4J 下面首先给出这四种方法的jar包下载地址: DOM:在现 ...

随机推荐

  1. 清除SVN版本控制文件

    命名为bat后缀文件,放在对应目录下. @echo on color 2f mode con: cols=80 lines=25 @REM @echo 正在清理SVN文件,请稍候...... @rem ...

  2. 如何用Wireshark捕获USB数据?

    现在越来越多的电子设备采用USB接口进行通讯,通讯标准也在逐步提高.那么,我们就会好奇这些设备是如何工作的?而无论你是一个硬件黑客,业余爱好者或者只是对它有一点兴趣的,USB对我们都是具有挑战性的. ...

  3. git clone

    raw text for ssh: git@github.com:TommyU/avbot_config.git git command on linux: git clone git://githu ...

  4. Linux的IO性能监控工具iostat详解

    Linux系统出现了性能问题,一般我们可以通过top.iostat.free.vmstat等命令来查看初步定位问题.其中iostat可以提供更丰富的IO性能状态数据. . 基本使用 $iostat - ...

  5. jQuery工作原理

    jQuery的开篇声明里有一段非常重要的话:jQuery是为了改变javascript的编码方式而设计的.从这段话可以看出jQuery本身并不是UI组件库或其他的一般AJAX类库.jQuery改变ja ...

  6. Binary Tree Longest Consecutive Sequence

    Given a binary tree, find the length of the longest consecutive sequence path (连续的路径,不是从小到大). The pa ...

  7. 【leetcode】Unique Binary Search Trees II

    Unique Binary Search Trees II Given n, generate all structurally unique BST's (binary search trees) ...

  8. default constructor,copy constructor,copy assignment

     C++ Code  12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 ...

  9. java web 学习 --第六天(Java三级考试)

    第五天学习在这:http://www.cnblogs.com/tobecrazy/p/3458592.html session对象 当某个用户首次访问web应用系统时,jsp会自动创建出一个sessi ...

  10. “假学习“&”真学习“?(摘)

    什么叫做“假学习”? 一.看书 买一堆书,有空看看.看书,这是典型的假学习.看书看不懂还在看,就是假学习,欺骗自己,安慰自己正在学习而已.专业书都写得很好,但大都是写给已经懂的人看的.看书的最大作用就 ...