原创文章欢迎转载,请保留出处。
若有任何疑问建议,欢迎回复。
邮箱:Maxwell_nc@163.com
解析XML主要有两种思想,一种是SAX(Simple API for XML),另一种是DOM(文档对象模型),其中在J2EE中,提供了JAXP来实现这两种解析,本文主要利用JAXP实现SAX解析,同时介绍时下流行的DOM4J实现DOM解析。
首先要有一个xml文件
<?xml version="1.0" encoding="UTF-8"?>
<测试><作者>maxwell_nc</作者><博客>http://blog.csdn.net/maxwell_nc</博客></测试>
引用一张经典图来说明SAX解析
接下来写代码:
package maxwell;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
public class SaxPaserDemo {
public static void main(String[] args) throws Exception {
//获取SAX解析器工厂
SAXParserFactory factory = SAXParserFactory.newInstance();
//通过工厂获取SAX解析器
SAXParser parser = factory.newSAXParser();
//获取XML阅读器
XMLReader reader = parser.getXMLReader();
//关联事件解析器
reader.setContentHandler(new MyContentHandler());
//解析XML文件
reader.parse("src/maxwell/demo.xml");
}
}
/*DefaultHandler是ContentHandler接口适配器*/
class MyContentHandler extends DefaultHandler{
@Override
public void startDocument() throws SAXException {
// 扫描到xml文档开始
System.out.println("xml解析开始");
}
@Override
public void endDocument() throws SAXException {
// 扫描到xml文档结束
System.out.println("xml解析结束");
}
@Override
public void startElement(String uri, String localName, String name,
Attributes attributes) throws SAXException {
// 发现开始标签,打印标签名
System.out.println("<"+name+">");
}
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
// 打印标签体
System.out.println(new String(ch, start, length));
}
}
SAX解析最大缺点就是不能RUD,而DOM可以,无奈本身JAXP的性能低下,所以现在流行使用DOM4J解析XML。
利用DOM4J来解析XML,代码实现上更加简单简洁。
package maxwell;
import java.io.FileOutputStream;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class Dom4jDemo {
public static void main(String[] args) throws Exception {
//利用dom4j获取XML阅读器
SAXReader reader = new SAXReader();
//获取document对象
Document document = reader.read("src/maxwell/demo.xml");
//获取根节点对象
Element root = document.getRootElement();
//打印标签体
System.out.println(root.element("作者").getText());
System.out.println(root.element("博客").getText());
//添加节点并添加属性,设置标签体
Element newEle = DocumentHelper.createElement("添加节点");
newEle.addAttribute("测试", "test");
newEle.setText("测试dom4j的添加节点功能");
root.add(newEle);
//写回文件
XMLWriter writer = new XMLWriter(new FileOutputStream("src/maxwell/demo.xml"),OutputFormat.createPrettyPrint());
writer.write(document);
writer.close();
}
}
而且带有美化输出的功能,修改后:
实际上无论JAXP还是DOM4J都支持DOM和SAX解析,但DOM4J操作都非常简单,而且性能要比JAXP强大,但要注意,要使用DOM4J必须导入jar文件。
原文地址:http://blog.csdn.net/maxwell_nc/article/details/45599279