详解Java解析XML的四种方法

来源:互联网 发布:mac 磁盘找不到原身 编辑:程序博客网 时间:2024/06/05 11:43

XML在不同的语言里解析方式都是一样的,只不过实现的语法不同而已。基本的解析方式有两种,一种叫SAX,另一种叫DOM。SAX是基于事件流的解析,DOM是基于XML文档树结构的解析。假设我们XML的内容和结构如下: 

1.DOM生成和解析XML文档

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

import java.io.File;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.NodeList;public class DomTest1{public static void main(String[] args) throws Exception{// step 1: 获得dom解析器工厂(工作的作用是用于创建具体的解析器)<span style="color:#ff0000;">DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();</span>//System.out.println("class name: " + dbf.getClass().getName());// step 2:获得具体的dom解析器<span style="color:#ff0000;">DocumentBuilder db = dbf.newDocumentBuilder();</span>//System.out.println("class name: " + db.getClass().getName());// step3: 解析一个xml文档,获得Document对象(根结点)<span style="color:#ff0000;">Document document = db.parse(new File("candidate.xml"));</span>NodeList list = document.getElementsByTagName("PERSON");for(int i = 0; i < list.getLength(); i++){Element element = (Element)list.item(i);String content = element.getElementsByTagName("NAME").item(0).getFirstChild().getNodeValue();System.out.println("name:" + content);content = element.getElementsByTagName("ADDRESS").item(0).getFirstChild().getNodeValue();System.out.println("address:" + content);content = element.getElementsByTagName("TEL").item(0).getFirstChild().getNodeValue();System.out.println("tel:" + content);content = element.getElementsByTagName("FAX").item(0).getFirstChild().getNodeValue();System.out.println("fax:" + content);content = element.getElementsByTagName("EMAIL").item(0).getFirstChild().getNodeValue();System.out.println("email:" + content);System.out.println("--------------------------------------");}}}

2.SAX生成和解析XML文档

为解决DOM的问题,出现了SAX。SAX ,事件驱动。当解析器发现元素开始、元素结束、文本、文档的开始或结束等时,发送事件,程序员编写响应这些事件的代码,保存数据。优点:不用事先调入整个文档,占用资源少;SAX解析器代码比DOM解析器代码小,适于Applet,下载。缺点:不是持久的;事件过后,若没保存数据,那么数据就丢了;无状态性;从事件中只能得到文本,但不知该文本属于哪个元素;使用场合:Applet;只需XML文档的少量内容,很少回头访问;机器内存少;

<span style="color:#333333;">import java.io.File;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;public class SaxTest1{public static void main(String[] args) throws Exception{//step1: 获得SAX解析器工厂实例</span><span style="color:#ff0000;">SAXParserFactory factory = SAXParserFactory.newInstance();</span><span style="color:#333333;">//step2: 获得SAX解析器实例</span><span style="color:#ff0000;">SAXParser parser = factory.newSAXParser();</span><span style="color:#333333;">//step3: 开始进行解析</span><span style="color:#ff0000;">parser.parse(new File("student.xml"), new MyHandler());</span><span style="color:#333333;">}}class MyHandler extends DefaultHandler{@Overridepublic void startDocument() throws SAXException{System.out.println("parse began");}@Overridepublic void endDocument() throws SAXException{System.out.println("parse finished");}@Overridepublic void startElement(String uri, String localName, String qName,Attributes attributes) throws SAXException{System.out.println("start element");}@Overridepublic void endElement(String uri, String localName, String qName)throws SAXException{System.out.println("finish element");}}</span>


3.DOM4J生成和解析XML文档

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

import java.io.FileOutputStream;import java.io.FileWriter;import org.dom4j.Document;import org.dom4j.DocumentHelper;import org.dom4j.Element;import org.dom4j.io.OutputFormat;import org.dom4j.io.XMLWriter;public class Test1{public static void main(String[] args) throws Exception{// 创建文档并设置文档的根元素节点 :第一种方式// Document document = DocumentHelper.createDocument();//// Element root = DocumentHelper.createElement("student");//// document.setRootElement(root);// 创建文档并设置文档的根元素节点 :第二种方式Element root = DocumentHelper.createElement("student");Document document = DocumentHelper.createDocument(root);root.addAttribute("name", "zhangsan");Element helloElement = root.addElement("hello");Element worldElement = root.addElement("world");helloElement.setText("hello");worldElement.setText("world");helloElement.addAttribute("age", "20");XMLWriter xmlWriter = new XMLWriter();xmlWriter.write(document);OutputFormat format = new OutputFormat("    ", true);XMLWriter xmlWriter2 = new XMLWriter(new FileOutputStream("student2.xml"), format);xmlWriter2.write(document);XMLWriter xmlWriter3 = new XMLWriter(new FileWriter("student3.xml"), format);xmlWriter3.write(document);xmlWriter3.close();}}



0 0