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("文档结束 "); } }