首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > XML SOAP >

详解Java解析XML的四种步骤(转)

2013-11-08 
详解Java解析XML的四种方法(转)XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无

详解Java解析XML的四种方法(转)

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的内容和结构如下:?

?

?

本文使用JAVA语言来实现DOM与SAX的XML文档生成与解析。
首先定义一个操作XML文档的接口XmlDocument 它定义了XML文档的建立与解析的接口。

?

?

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;iElement employee=(Element)employeeList.get(i);?? List employeeInfo=employee.getChildren();?? for(int j=0;jSystem.out.println(((Element)employeeInfo.get(j)).getName()+":"+((Element)employeeInfo.get(j)).getValue());?? }?? }?? } catch (JDOMException e) {?? e.printStackTrace();?? } catch (IOException e) {?? e.printStackTrace();?? }??? }?? }?? ? 

?

?

【编辑推荐】

热点排行