1.JAVA处理XML的文件接口
对XML数据文件操作的接口,目前存在2类标准:DOM & SAX。DOM将xml数据文件作为整体来处理,SAX将XML作为数据流来处理。
除上述2类标准外还有很多非标准的XML操作接口:JDOM、DOM4J等。这些接口或模块与标准的DOM不兼容,但由于其易用性,在java开发群体中有着十分广泛的应用。
1.1 DOM标准
DOM是一种操作XML数据文件最广泛的标准,独立于特定的语言和平台。很多XML解析器都实现DOM接口标准。DOM标准最基本的思想是将整个XML数据文件载入内存,将其解析成一颗树形对象。因而基于DOM的处理器内存要求比较高,但速度较快。
DOM标准由W3C负责维持,http://www.w3c.org网上有最新的DOM标准规范文件。
1.2 SAX标准
该标准是读一部分数据,再处理一部分数据。该接口通常是基于时间的,其将XML数据文件中不同的内容归类为不同对象。当SAX处理器分析到不同的对象时,就产生不同的事件,进而调用不同的事件处理器。
1.3 JAXP规范
JAXP是SUN公司提出的一种JAVA操作XML的 标准。JAXP的作用是在JAVA应用程序和具体解析器之间提供一个统一编程接口,从而提高JAVA应用程序的可移植性。JAXP只是规范了JAVA应用程序获取DOM或SAX接口的方式,规范了JAVA应用程序加载XML解析器的方式。JAXP本身只是一个JAVA的接口框架。
2、使用JAXP操作XML
2.1 通过JAXP以DOM方式操作XML
import org.w3c.dom.*;
import org.xml.sax.*;
import javax.xml.parsers.*;
import java.io.*;
public class Test {
public static void main(String args[]) {
try{
String path = "xml";
DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
//使不支持合法性验证
domFactory.setValidating(false);
//使支持名称空间
domFactory.setNamespaceAware(true);
//新建DocumentBuilder 对象
DocumentBuilder domBuilder = domFactory.newDocumentBuilder();
//通过DocumentBuilder 对象将XML解析成一个DOM的Document对象
Document document = domBuilder.parse(new File(path));
//获得第一个子节点(此处为根节点)
Node mynode = document.getFirstChild();
int nodeType = mynode.getNodeType();
String nodeName = mynode.getNodeName();
String nodeValue = mynode.getNodeValue();
System.out.println(nodeType);
System.out.println(nodeName);
System.out.println(nodeValue);
}catch(Exception ex){
ex.printStackTrace();
}
}
}
以上使用的是JDK自带的Xerces解析器,作为结果程序中没有任何和Xerces相关的代码,这是JAXP模块的最大的优点----隐藏了具体XML解析器的调用细节,使用户代码独立于特定的解析器,并可以在不同的解析器之间进行切换。
2.2 通过JAXP以SAX方式操作XML
import java.io.IOException;
import javax.xml.parsers.*;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
*
* date 12008-12-16
* SAX解析XML文件
* 优点,简单
*
*/
public class SAXtoMyxml {
public static void main(String[] args) throws ParserConfigurationException,
SAXException, IOException {
// 通过工厂获得SAX解析器
SAXParserFactory sf = SAXParserFactory.newInstance();
SAXParser sax = sf.newSAXParser();
//解析器
// 通过解析器解析xml文件
sax.parse("myxml1.xml", new SAXHander()); //使用自定义的监听器
}
}
// 自定义sax解析监听器
class SAXHander extends DefaultHandler {
public void startDocument() throws SAXException {
System.out.println("文档开始 ");
}
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
System.out.println("元素开始 "+qName);
}
public void characters(char[] ch, int start, int length) throws SAXException {
String text = new String(ch,start,length);
//去掉xml文件中的空格节点
if(text.trim().equals("")) {
return;
}
System.out.println("文本内容 "+text);
}
public void endElement(String uri, String localName, String qName) throws SAXException {
System.out.println("元素结束 "+qName);
}
public void endDocument() throws SAXException {
System.out.println("文档结束 ");
}
}