解析XML一般有两种方式

DOM:基于树结构或基于对象的。通常需要加载整个文档的来分析层次结构,对资源的要求比较高。

SAX:基于事件驱动。在解析XML的时候会触发一系列的事件发现给定的tag,会激活一个回调方法。告诉方法指定的标签已经找到。

下面看下四种方法具体的实现方式

1、新建一个XmlDocument接口

package com.xml;

 public interface XmlDocument {
void createXml(String fileName);
void parseXml(String fileName);
 }

2、javase1.6内置的DOM方式的解析

package com.xml;

 import java.io.FileNotFoundException;
 import java.io.IOException;
 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;

 public class DomParse implements XmlDocument {

private Document document;
private String fileName;

public void init() {
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory
.newInstance();
try {
DocumentBuilder documentBuilder = documentBuilderFactory
.newDocumentBuilder();
this.document = documentBuilder.newDocument();
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
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("jack"));
employee.appendChild(name);

Element sex = this.document.createElement("sex");
sex.appendChild(this.document.createTextNode("Male"));
employee.appendChild(sex);

Element age = this.document.createElement("age");
age.appendChild(this.document.createTextNode("14"));
employee.appendChild(age);

root.appendChild(employee);

TransformerFactory transformerFactory = TransformerFactory
.newInstance();
try {
Transformer transformer = transformerFactory.newTransformer();
DOMSource domSource = new DOMSource(this.document);
transformer.setOutputProperty(OutputKeys.ENCODING, "utf-8");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
PrintWriter printWriter = new PrintWriter(fileName);
StreamResult streamResult = new StreamResult(printWriter);
transformer.transform(domSource, streamResult);
System.out.println("success!");
} catch (TransformerConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (TransformerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void parseXml(String fileName) {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try {
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++) {
if (!"#text".equals(employeeMeta.item(k).getNodeName())) {
System.out.println(employeeMeta.item(k).getNodeName()
+ ":" + employeeMeta.item(k).getTextContent());
}
}
}
}
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
String fileName="E:/employee.xml";//在E盘创建一个employee.xml文档
DomParse domParse=new DomParse();
//domParse.init();
//domParse.createXml(fileName);
domParse.parseXml(fileName);
}
 }

2.javase1.6中内置的SAX解析

package com.xml;
 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;
 public class SaxParse implements XmlDocument {
@Override
public void createXml(String fileName) {
System.out.println(fileName);
}
@Override
public void parseXml(String fileName) {
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
try {
SAXParser saxParser = saxParserFactory.newSAXParser();
InputStream inputStream = new FileInputStream(fileName);
saxParser.parse(inputStream, new MySAXHandler());
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
 }
 class MySAXHandler extends DefaultHandler {
boolean hasAttributes = false;
Attributes attributes;
@Override
public void startDocument() throws SAXException {
System.out.println("document start!");
}
@Override
public void endDocument() throws SAXException {
System.out.println("document end!");
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
System.out.println("startElement() is invoked");
if ("employees".equals(qName)) {
return;
}
if ("employee".equals(qName)) {
return;
}
if (attributes.getLength() > 0) {
this.attributes = attributes;
hasAttributes = true;
}
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
System.out.println("endElement()  is  invoked!");
if (hasAttributes && attributes != null) {
for (int i = 0; i < attributes.getLength(); i++) {
System.out.println(attributes.getQName(0) + ":"+ attributes.getValue(0));
}
}
}
//用于获取结点的文本
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
System.out.println("characters()  is invoked!");
System.out.println(new String(ch,start,length));
}
public static void main(String[] args) {
SaxParse saxParse=new SaxParse();
saxParse.parseXml("E:/employee.xml");
}
 }

3.JDom的形式需要引入第三方的jar

package com.xml;
 import java.io.IOException;
 import java.util.List;
 import org.jdom2.Document;
 import org.jdom2.Element;
 import org.jdom2.JDOMException;
 import org.jdom2.input.SAXBuilder;
 public class JdomParse implements XmlDocument {
@Override
public void createXml(String fileName) {
}
@Override
public void parseXml(String fileName) {
SAXBuilder saxBuilder = new SAXBuilder();
try {
Document document = saxBuilder.build(fileName);
Element employees = document.getRootElement();
List<Element> employeeList = employees.getChildren();
for (int i = 0; i < employeeList.size(); i++) {
Element employee = employeeList.get(i);
List<Element> employeeInfo = employee.getChildren();
for (int j = 0; j < employeeInfo.size(); j++) {
System.out.println(employeeInfo.get(j).getName() + ":"
+ employeeInfo.get(j).getValue());
}
}
} catch (JDOMException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
 }

4.dom4j的方式需引入dom4j的包

package com.xml;
 import java.io.File;
 import java.util.Iterator;
 import javax.xml.transform.sax.SAXResult;
 import org.dom4j.Document;
 import org.dom4j.DocumentException;
 import org.dom4j.Element;
 import org.dom4j.io.SAXReader;
 public class Dom4jParse implements XmlDocument {
@Override
public void createXml(String fileName) {
}
@Override
public void parseXml(String fileName) {
File file=new File(fileName);
SAXReader saxReader=new SAXReader();
try {
Document document = saxReader.read(file);
Element employees = document.getRootElement();
Iterator elementIterator = employees.elementIterator();
while (elementIterator.hasNext()) {
Element employee= (Element) elementIterator.next();
Iterator iterator = employee.elementIterator();
while (iterator.hasNext()) {
Element employeeInfo= (Element) iterator.next();
System.out.println(employeeInfo.getName()+":"+employeeInfo.getText());
}
}
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
Dom4jParse dom4jParse=new Dom4jParse();
dom4jParse.parseXml("E:/employee.xml");
}
 }