`
silenceisall
  • 浏览: 31327 次
  • 性别: Icon_minigender_1
  • 来自: 湖北
社区版块
存档分类
最新评论

XML的4中解析方式

阅读更多
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代码

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));  

}  



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代码

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

Element employee=(Element)employeeList.get(i);  

List employeeInfo=employee.getChildren();  

for(int j=0;j

System.out.println(((Element)employeeInfo.get(j)).getName()+":"+((Element)employeeInfo.get(j)).getValue());  

}  

}  

} catch (JDOMException e) {  

e.printStackTrace();  

} catch (IOException e) {  

e.printStackTrace();  

}   

}  

}  
分享到:
评论

相关推荐

    C# XML解析方式

    ### C#中的XML解析方式 #### 1. XML Text Reader(流式解析) - **简介**:在.NET框架中,`XMLTextReader`是一种高效的流式XML解析器,适用于处理大型XML文档或当只需要读取文档的部分内容时。 - **特点**: - **...

    xml4种 解析方式

    xml的 各种解析方式 dom是基于节点的方式 在dom中利用XmlDocument doc=new XmlDocument()创建document对象, 利用"doc.createElement(节点名称)"来创建字节点,然后用"doc.createTextNode(节点内容)"来为节点添加内容...

    xml四种解析方式

    XML(eXtensible Markup Language)是一种用于标记数据的语言,广泛应用于数据交换、配置文件、文档存储等领域。...在实际应用中,开发者应根据项目需求,权衡性能、易用性和资源消耗,选择最适合的XML解析方式。

    易语言 xml解析 易语言 xml解析 教程 带源码

    易语言XML解析是编程领域中的一个重要主题,尤其对于使用易语言进行开发的程序员来说,理解并掌握XML(可扩展标记语言)的解析方法是至关重要的。XML作为一种结构化数据存储和交换格式,广泛应用于网络通信、配置...

    xml解析文件的两种方式

    本文将详细介绍XML解析文件的两种主要方式:SAX(Simple API for XML)和DOM(Document Object Model)。 **1. DOM解析** DOM解析方式是将整个XML文档加载到内存中,构建一个树形结构,称为DOM树。这个树的每个...

    java在线解析xmljava在线解析xmljava在线解析xmljava在线解析xml

    java在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava在线解析xmljava...

    dom4j解析xml详解

    DOM4J是一个由dom4j.org开发的开源XML解析包,专为Java平台设计,它不仅支持DOM、SAX和JAXP标准,还巧妙地融入了Java集合框架,使其成为Java开发者在处理XML数据时的强大工具。DOM4J的最大亮点在于其简洁易用的API...

    android xml三种解析方式

    本篇将详细探讨Android中的三种XML解析方式:DOM解析、SAX解析和Pull解析。 1. DOM解析(Document Object Model) DOM解析器会将整个XML文档加载到内存中,构建一个树形结构,称为DOM树。这种解析方式的优点是能够...

    xml 解析 xml 解析几何

    在本文中,我们将深入探讨XML解析,以及如何在Java中处理XML文档。 XML解析是将XML文档转换为编程语言可以理解和操作的数据结构的过程。解析XML主要有两种方法:DOM(Document Object Model)和SAX(Simple API for...

    xmldom4j解析

    XML解析主要有两种方式:DOM(文档对象模型)和SAX(简单API for XML)。DOM解析会将整个XML文档加载到内存中形成一棵树形结构,方便访问任意节点,但内存消耗大;SAX解析则采用事件驱动,逐行读取XML,适合处理大型...

    XML解析MSXML解析

    总的来说,XML解析是软件开发中的基础技能,掌握MSXML解析器的使用对于在Windows环境下处理XML数据至关重要。理解DOM和SAX两种解析模式的优缺点,以及如何在MSXML中应用它们,是提升开发效率的关键。同时,不断学习...

    XML解析工具

    读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好。 TinyXML是一个开源的解析XML的解析库,能够用于C++,...

    三种解析XML的方法

    在Java中,有三种主要的XML解析方法:DOM(Document Object Model)、SAX(Simple API for XML)和dom4j。每种方法都有其特点和适用场景,下面将详细阐述这三种解析方法。 1. DOM解析: DOM解析器将整个XML文档加载...

    XML解析器示例

    在LabVIEW(Laboratory Virtual Instrument Engineering Workbench)这个强大的图形化编程环境中,XML解析器是处理和操作XML数据的关键工具。本示例主要展示了如何在LabVIEW中实现XML文件的加载、保存和解析。 首先...

    java xml解析工具类 java xml解析工具类

    java xml解析工具类 java xml解析工具类java xml解析工具类 java xml解析工具类java xml解析工具类 java xml解析工具类java xml解析工具类 java xml解析工具类java xml解析工具类 java xml解析工具类java xml解析...

    dom4j 解析写入xml

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

    C++解析xml文件

    在IT领域,XML(eXtensible Markup Language)是一种用于标记数据的标准格式,它具有自我描述性和灵活性,广泛应用于数据交换...在实际项目中,根据具体需求,还可以结合其他库或自定义逻辑来实现更复杂的XML解析功能。

    XML的三种解析方式

    4. 遍历对象属性,根据属性创建XML元素,写入到输出流中。 5. 在适当位置关闭元素。 6. 最后,关闭XML输出流,完成保存。 每种解析方式都有其适用场景,选择哪种取决于具体需求。DOM适合于需要频繁查询和修改XML...

    解析xml和本地解析xml

    同时,优化XML解析和数据库操作以提高性能,如使用流式解析减少内存消耗,使用索引加速查询等。 总之,XML作为数据交换的重要工具,在线解析和本地解析各有优势,选择哪种方式取决于具体需求。从CLOB字段中提取XML...

Global site tag (gtag.js) - Google Analytics