`
kakaluyi
  • 浏览: 444432 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

解析xml的4中方法(推荐dom4j)

阅读更多

XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便。对于XML本身的语法知识与技术细节,需要阅读相关的技术文献,这里面包括的内容有DOM(Document Object Model),DTD(Document Type Definition),SAX(Simple API for XML),XSD(Xml Schema Definition),XSLT(Extensible Stylesheet Language Transformations),具体可参阅w3c官方网站文档http://www.w3.org获取更多信息。
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文档
为解决DOM的问题,出现了SAX。SAX ,事件驱动。当解析器发现元素开始、元素结束、文本、文档的开始或结束等时,发送事件,程序员编写响应这些事件的代码,保存数据。优点:不用事先调入整个文档,占用资源少;SAX解析器代码比DOM解析器代码小,适于Applet,下载。缺点:不是持久的;事件过后,若没保存数据,那么数据就丢了;无状态性;从事件中只能得到文本,但不知该文本属于哪个元素;使用场合:Applet;只需XML文档的少量内容,很少回头访问;机器内存少;

Java代码 复制代码
  1. package com.alisoft.facepay.framework.bean;   
  2.   
  3. import java.io.FileInputStream;   
  4. import java.io.FileNotFoundException;   
  5. import java.io.IOException;   
  6. import java.io.InputStream;   
  7.   
  8. import javax.xml.parsers.ParserConfigurationException;   
  9. import javax.xml.parsers.SAXParser;   
  10. import javax.xml.parsers.SAXParserFactory;   
  11.   
  12. import org.xml.sax.Attributes;   
  13. import org.xml.sax.SAXException;   
  14. import org.xml.sax.helpers.DefaultHandler;   
  15. /**  
  16.  *   
  17.  * @author hongliang.dinghl  
  18.  * SAX文档解析  
  19.  */  
  20. public class SaxDemo implements XmlDocument {   
  21.   
  22.     public void createXml(String fileName) {   
  23.         System.out.println("<<"+filename+">>");   
  24.     }   
  25.   
  26.     public void parserXml(String fileName) {   
  27.         SAXParserFactory saxfac = SAXParserFactory.newInstance();   
  28.   
  29.         try {   
  30.   
  31.             SAXParser saxparser = saxfac.newSAXParser();   
  32.   
  33.             InputStream is = new FileInputStream(fileName);   
  34.   
  35.             saxparser.parse(is, new MySAXHandler());   
  36.   
  37.         } catch (ParserConfigurationException e) {   
  38.   
  39.             e.printStackTrace();   
  40.   
  41.         } catch (SAXException e) {   
  42.   
  43.             e.printStackTrace();   
  44.   
  45.         } catch (FileNotFoundException e) {   
  46.   
  47.             e.printStackTrace();   
  48.   
  49.         } catch (IOException e) {   
  50.   
  51.             e.printStackTrace();   
  52.   
  53.         }   
  54.   
  55.     }   
  56.   
  57. }   
  58.   
  59. class MySAXHandler extends DefaultHandler {   
  60.   
  61.     boolean hasAttribute = false;   
  62.   
  63.     Attributes attributes = null;   
  64.   
  65.     public void startDocument() throws SAXException {   
  66.   
  67.         System.out.println("文档开始打印了");   
  68.   
  69.     }   
  70.   
  71.     public void endDocument() throws SAXException {   
  72.   
  73.         System.out.println("文档打印结束了");   
  74.   
  75.     }   
  76.   
  77.     public void startElement(String uri, String localName, String qName,   
  78.   
  79.     Attributes attributes) throws SAXException {   
  80.   
  81.         if (qName.equals("employees")) {   
  82.   
  83.             return;   
  84.   
  85.         }   
  86.   
  87.         if (qName.equals("employee")) {   
  88.   
  89.             System.out.println(qName);   
  90.   
  91.         }   
  92.   
  93.         if (attributes.getLength() > 0) {   
  94.   
  95.             this.attributes = attributes;   
  96.   
  97.             this.hasAttribute = true;   
  98.   
  99.         }   
  100.   
  101.     }   
  102.   
  103.     public void endElement(String uri, String localName, String qName)   
  104.   
  105.     throws SAXException {   
  106.   
  107.         if (hasAttribute && (attributes != null)) {   
  108.   
  109.             for (int i = 0; i < attributes.getLength(); i++) {   
  110.   
  111.                 System.out.println(attributes.getQName(0)   
  112.                         + attributes.getValue(0));   
  113.   
  114.             }   
  115.   
  116.         }   
  117.   
  118.     }   
  119.   
  120.     public void characters(char[] ch, int start, int length)   
  121.   
  122.     throws SAXException {   
  123.   
  124.         System.out.println(new String(ch, start, length));   
  125.   
  126.     }   
  127.   
  128. }  
package com.alisoft.facepay.framework.bean;

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.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
 * 
 * @author hongliang.dinghl
 * SAX文档解析
 */
public class SaxDemo implements XmlDocument {

	public void createXml(String fileName) {
        System.out.println("<<"+filename+">>");
	}

	public void parserXml(String fileName) {
		SAXParserFactory saxfac = SAXParserFactory.newInstance();

		try {

			SAXParser saxparser = saxfac.newSAXParser();

			InputStream is = new FileInputStream(fileName);

			saxparser.parse(is, new MySAXHandler());

		} catch (ParserConfigurationException e) {

			e.printStackTrace();

		} catch (SAXException e) {

			e.printStackTrace();

		} catch (FileNotFoundException e) {

			e.printStackTrace();

		} catch (IOException e) {

			e.printStackTrace();

		}

	}

}

class MySAXHandler extends DefaultHandler {

	boolean hasAttribute = false;

	Attributes attributes = null;

	public void startDocument() throws SAXException {

		System.out.println("文档开始打印了");

	}

	public void endDocument() throws SAXException {

		System.out.println("文档打印结束了");

	}

	public void startElement(String uri, String localName, String qName,

	Attributes attributes) throws SAXException {

		if (qName.equals("employees")) {

			return;

		}

		if (qName.equals("employee")) {

			System.out.println(qName);

		}

		if (attributes.getLength() > 0) {

			this.attributes = attributes;

			this.hasAttribute = true;

		}

	}

	public void endElement(String uri, String localName, String qName)

	throws SAXException {

		if (hasAttribute && (attributes != null)) {

			for (int i = 0; i < attributes.getLength(); i++) {

				System.out.println(attributes.getQName(0)
						+ attributes.getValue(0));

			}

		}

	}

	public void characters(char[] ch, int start, int length)

	throws SAXException {

		System.out.println(new String(ch, start, length));

	}

}


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

Java代码 复制代码
  1. package com.alisoft.facepay.framework.bean;   
  2.   
  3. import java.io.File;   
  4. import java.io.FileWriter;   
  5. import java.io.IOException;   
  6. import java.io.Writer;   
  7. import java.util.Iterator;   
  8.   
  9. import org.dom4j.Document;   
  10. import org.dom4j.DocumentException;   
  11. import org.dom4j.DocumentHelper;   
  12. import org.dom4j.Element;   
  13. import org.dom4j.io.SAXReader;   
  14. import org.dom4j.io.XMLWriter;   
  15. /**  
  16.  *   
  17.  * @author hongliang.dinghl  
  18.  * Dom4j 生成XML文档与解析XML文档  
  19.  */  
  20. public class Dom4jDemo implements XmlDocument {   
  21.   
  22.     public void createXml(String fileName) {   
  23.         Document document = DocumentHelper.createDocument();   
  24.         Element employees=document.addElement("employees");   
  25.         Element employee=employees.addElement("employee");   
  26.         Element name= employee.addElement("name");   
  27.         name.setText("ddvip");   
  28.         Element sex=employee.addElement("sex");   
  29.         sex.setText("m");   
  30.         Element age=employee.addElement("age");   
  31.         age.setText("29");   
  32.         try {   
  33.             Writer fileWriter=new FileWriter(fileName);   
  34.             XMLWriter xmlWriter=new XMLWriter(fileWriter);   
  35.             xmlWriter.write(document);   
  36.             xmlWriter.close();   
  37.         } catch (IOException e) {   
  38.                
  39.             System.out.println(e.getMessage());   
  40.         }   
  41.            
  42.            
  43.     }   
  44.   
  45.   
  46.     public void parserXml(String fileName) {   
  47.          File inputXml=new File(fileName);   
  48.          SAXReader saxReader = new SAXReader();   
  49.          try {   
  50.             Document document = saxReader.read(inputXml);   
  51.             Element employees=document.getRootElement();   
  52.             for(Iterator i = employees.elementIterator(); i.hasNext();){   
  53.                  Element employee = (Element) i.next();   
  54.                  for(Iterator j = employee.elementIterator(); j.hasNext();){   
  55.                      Element node=(Element) j.next();   
  56.                      System.out.println(node.getName()+":"+node.getText());   
  57.                  }   
  58.   
  59.             }   
  60.         } catch (DocumentException e) {   
  61.             System.out.println(e.getMessage());   
  62.         }   
  63.      System.out.println("dom4j parserXml");   
  64.     }   
  65.   
  66.   
  67. }   
  68. 4.JDOM生成和解析XML   
  69. 为减少DOM、SAX的编码量,出现了JDOM;优点:20-80原则,极大减少了代码量。使用场合:要实现的功能简单,如解析、创建等,但在底层,JDOM还是使用SAX(最常用)、DOM、Xanan文档。   
  70. <PRE class=java name="code">package com.alisoft.facepay.framework.bean;   
  71.   
  72. import java.io.FileNotFoundException;   
  73. import java.io.FileOutputStream;   
  74. import java.io.IOException;   
  75. import java.util.List;   
  76.   
  77. import org.jdom.Document;   
  78. import org.jdom.Element;   
  79. import org.jdom.JDOMException;   
  80. import org.jdom.input.SAXBuilder;   
  81. import org.jdom.output.XMLOutputter;   
  82. /**  
  83.  *   
  84.  * @author hongliang.dinghl  
  85.  * JDOM 生成与解析XML文档  
  86.  *   
  87.  */  
  88. public class JDomDemo implements XmlDocument {   
  89.   
  90.     public void createXml(String fileName) {   
  91.       Document document;   
  92.       Element  root;   
  93.       root=new Element("employees");   
  94.       document=new Document(root);   
  95.       Element employee=new Element("employee");   
  96.       root.addContent(employee);   
  97.       Element name=new Element("name");   
  98.       name.setText("ddvip");   
  99.       employee.addContent(name);   
  100.       Element sex=new Element("sex");   
  101.       sex.setText("m");   
  102.       employee.addContent(sex);   
  103.       Element age=new Element("age");   
  104.       age.setText("23");   
  105.       employee.addContent(age);   
  106.       XMLOutputter XMLOut = new XMLOutputter();   
  107.       try {   
  108.         XMLOut.output(document, new FileOutputStream(fileName));   
  109.     } catch (FileNotFoundException e) {   
  110.         e.printStackTrace();   
  111.     } catch (IOException e) {   
  112.         e.printStackTrace();   
  113.     }   
  114.   
  115.     }   
  116.   
  117.     public void parserXml(String fileName) {   
  118.         SAXBuilder builder=new SAXBuilder(false);    
  119.         try {   
  120.             Document document=builder.build(fileName);   
  121.             Element employees=document.getRootElement();    
  122.             List employeeList=employees.getChildren("employee");   
  123.             for(int i=0;i<employeeList.size();i++){   
  124.                 Element employee=(Element)employeeList.get(i);   
  125.                 List employeeInfo=employee.getChildren();   
  126.                 for(int j=0;j<employeeInfo.size();j++){   
  127.                     System.out.println(((Element)employeeInfo.get(j)).getName()+":"+((Element)employeeInfo.get(j)).getValue());   
  128.                        
  129.                 }   
  130.             }   
  131.         } catch (JDOMException e) {   
  132.            
  133.             e.printStackTrace();   
  134.         } catch (IOException e) {   
  135.            
  136.             e.printStackTrace();   
  137.         }    
  138.   
  139.     }   
  140. }   
  141.   </PRE> 
分享到:
评论

相关推荐

    dom4j解析xml详解

    ### DOM4J解析XML详解 #### 一、DOM4J简介与特性 DOM4J是一个由dom4j.org开发的开源XML解析包,专为Java平台设计,它不仅支持DOM、SAX和JAXP标准,还巧妙地融入了Java集合框架,使其成为Java开发者在处理XML数据时...

    dom4j 解析写入xml

    1、xml文档解析 2、 dom4j解析xml 3、实现xml文件解析 xml字符串解析 xml MAP键值对解析 4、实现xml写入与生成文件

    使用 dom4j 解析 XML

    使用 dom4j 解析 XML dom4j 解析 XML dom4j解析xml

    dom4j 解析(读取) xml 节点数据

    要开始解析XML文件,首先需要导入DOM4J的相关包: ```java import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; ``` 接下来,我们将创建...

    java解析xml并导入数据库(dom4j).doc

    Java 解析 XML 并导入数据库(DOM4J) ...本例展示了如何使用 Java 语言和 DOM4J 库来解析 XML 文件并将其导入到数据库中。该示例代码提供了一个基本的框架,用于开发 XML 文件导入数据库的应用程序。

    dom4j解析xml文件的压缩包

    为了使用这个库,你需要将该jar包添加到项目的类路径中,然后就可以通过DOM4J提供的类和方法来解析和操作XML文件了。 总之,DOM4J是一个功能强大的XML处理库,无论是在小型项目还是大型系统中,都能发挥其优势,...

    dom4j解析XML所需jar包

    2. **XML解析**:DOM4J支持多种解析方式,包括SAX(Simple API for XML)和DOM。SAX是基于事件的解析,适用于处理大文件;DOM则将整个XML文档加载到内存,适合小规模或内存允许的情况。DOM4J还提供了StAX(Streaming...

    使用dom4j和jaxen解析xml

    - **dom4j+jaxen操作XML**:首先使用dom4j解析XML,然后通过jaxen创建XPath对象并执行查询。查询结果可以是元素、属性或其他XML节点,根据需要进行进一步处理。 例如,以下代码展示了如何使用dom4j和jaxen解析XML...

    xmldom4j解析

    在“jar包执行20190331.rar”文件中,可能包含了一个Java项目,该项目使用DOM4J库解析XML文件并执行相关业务逻辑。执行此类项目通常涉及以下步骤: 1. 将jar包解压,找到主类(包含main方法)。 2. 使用Java命令行...

    dom4j解析xml

    ### DOM4J解析XML知识点详解 #### 一、DOM4J简介 DOM4J是一个Java库,用于处理XML文档。它的设计目标是为了提供一个简单、易于使用的API来处理XML文件,同时保持性能上的优势。与Java标准库中的DOM实现相比,DOM4J...

    DOM4J 解析XML

    **DOM4J解析XML** DOM4J是一个强大的Java库,专门用于处理XML文档。它提供了灵活、高效且功能丰富的API,使得XML的读取、创建、修改和查询变得简单易行。DOM4J的主要特点包括对XPath的支持、事件驱动的解析、以及与...

    java dom4j解析xml

    Java DOM4J解析XML是一种常见的处理XML文档的技术,它提供了灵活且高效的API,使得...通过理解上述DOM4J解析XML的基本概念、操作和示例,开发者可以有效地在Java项目中处理XML数据,无论是读取、创建还是修改XML文件。

    xml 三种解析方式dom,sax,dom4j

    在提供的压缩包中,包含了关于这三种解析方式的代码示例,你可以参考这些代码了解如何在Java环境中使用DOM、SAX和DOM4J进行XML解析。通过阅读和理解这些示例,你可以更好地掌握XML解析技术,并根据项目需求选择合适...

    dom4j解析xml实例

    通过学习和实践这些基本操作,你可以熟练掌握DOM4J解析XML的技巧,为你的Java项目中处理XML数据提供强大的支持。在项目中遇到具体问题时,可以参考DOM4J的官方文档,或利用在线资源进行更深入的学习。

    分别使用DOM和DOM4j解析XML文件

    首先,DOM是一种标准的W3C推荐的解析XML的方法,它将整个XML文档加载到内存中,形成一个树形结构,便于程序进行遍历和操作。DOM解析器将XML文档转化为一个复杂的对象模型,可以访问和修改XML的所有元素和属性。在...

    使用dom4j 和本地dom 解析xml 文件

    在Java中,解析XML文件是常见的任务,通常有DOM(Document Object Model)和DOM4J两种方式。下面我们将详细探讨这两种解析方法。 DOM解析方式是将整个XML文件加载到内存中,形成一棵DOM树,每个节点代表XML文档的一...

    DOM4J jar包 xml解析 所有的dom4j-1.6.1 dom4j-2.0.2 dom4j-2.1.1包 导入直接使用

    1. **解析XML**:DOM4J可以读取XML文件,将其转换为一个树形结构,即Document对象。解析器有SAX和DOM两种模式,SAX是事件驱动的,适用于大文件,而DOM则将整个文档加载到内存中,适合小文件。 2. **创建XML**:DOM4...

Global site tag (gtag.js) - Google Analytics