DOM解析:xml解析器一次性把整个xml文档加载进内存,然后在内存中构建一颗Document的对象树,通过Document对象,得到树上的节点对象,通过节点对象访问(操作)到xml文档的内容。
//创建需要解析的xml文档对象
File xmlfile=new File("src/com/hts/dom/xml/Dom.xml");
//声明DocumentBuilder对象,抽象类,不能实例化
DocumentBuilder builder=null;
//通过单例模式创建DocumentBuilderFactory对象
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
try {
//实例化builder
builder=builderFactory.newDocumentBuilder();
//解析xml文档
Document document=builder.parse(xmlfile);
//获取根节点对象
Element element=document.getDocumentElement();
System.out.println("根元素:"+element.getNodeName());
//获得根节点下的子节点
NodeList nodeList=element.getChildNodes();
//遍历
for (int i = 0; i < nodeList.getLength(); i++) {
//获取每一个节点
Node node=nodeList.item(i);
if("page-one".equals(node.getNodeName())){
//打印元素属性
System.out.println(node.getAttributes().getNamedItem("test").getNodeValue());
//输出节点内容
System.out.println(node.getTextContent());
}
/* */
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
步骤
- 创建Document对象
DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance();//获取factory
DocumentBuilder builder=builderFactory.newDocumentBuilder();//获取bulider对象
Document document=builder.parse(xmlfile);//创建xml对象
- 使用Document中的方法对xml内容进行处理,下面列举几种常用方法
方法 | 描述 |
---|---|
Element getDocumentElement(String data) | 返回该XML文档根元素 |
Elmement createElement(String tagName) | 创建一个元素 |
Text createTextNode(String data) | 创建一个文本节点 |
String getXmlVersion() | 放回XML的版本号 |
Attr createAttribute(String name) | 已参数名称创建一个属性 |
SAX解析:基于事件响应模型进行解析XML,解析时,触发一系列事件。(不能修改数据)
// 创建需要解析的xml文档对象
File xmlfile = new File("src/com/hts/dom/xml/Dom.xml");
//用单例模式创建SAXParserFactory对象
SAXParserFactory parserFactory=SAXParserFactory.newInstance();
try {
//创建SAXParser对象
SAXParser parser=parserFactory.newSAXParser();
//解析文件,定义解析时的事件处理
parser.parse(xmlfile,new SaxHandler());
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
步骤
- 解析XML文件
SAXParserFactory parserFactory=SAXParserFactory.newInstance();//获取factory
SAXParser parser=parserFactory.newSAXParser();//获取parser
parser.parse(xmlfile,new SaxHandler());//开始解析
- SAX解析是事件驱动型的,还需要些一个事件的监听器对象
package com.hts.sax.xml;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class SaxHandler extends DefaultHandler {
private String content;
/*
*事件发生时元素中的字符
* */
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
// TODO Auto-generated method stub
content = new String(ch, start, length);
}
//解析到元素的结束标签触发
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if ("page-one".equals(qName)) {
System.out.println(content);
}
}
//解析到元素的开始标签时触发
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
if ("page-one".equals(qName)) {
System.out.println(attributes.getValue("test"));
}
}
}
DOM和SAX解析方式的优劣
DOM将数据存储在内存中,而SAX不存储数据。
- 如果必须对数据进行更改,并且作为 XML 将它输出,则在大多数情况下,使用 DOM。
- 对于大文件,SAX 是更好的选择。
- 如果实际上只使用一小部分数据,则使用 SAX 将数据抽取到应用程序中,这种方法更好些。
- 通常,SAX 实现比 DOM 实现快。