首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > XML SOAP >

xml的解析模式

2013-06-26 
xml的解析方式解析xml有四种方法:DOM,SAX,DOM4j,JDOM.我们主要学了两种:DOM和SAX.DOM适于解析比较简单的XM

xml的解析方式
   解析xml有四种方法:DOM,SAX,DOM4j,JDOM.
     我们主要学了两种:DOM和SAX.
     DOM适于解析比较简单的XML而SAX则适于解析较复杂的XML文件。各有各的好。

     DOM和SAX的不同:
     1. DOM是基于内存的,不管文件有多大,都会将所有的内容预先装载到内存中。从而消耗很大的内存空间。而SAX是基于事件的。当某个事件被触发时,才获取相应的XML的部分数据,从而不管XML文件有多大,都只占用了少量的内存空间。
     2. DOM可以读取XML也可以向XML文件中插入数据,而SAX却只能对XML进行读取,而不能在文件中插入数据。这也是SAX的一个缺点。
     3.SAX的另一个缺点:DOM我们可以指定要访问的元素进行随机访问,而SAX则不行。SAX是从文档开始执行遍历的。并且只能遍历一次。也就是说我们不能随机的访问XML文件,只能从头到尾的将XML文件遍历一次(当然也可以中间截断遍历)。


Dom解析

example1.xml
<Root>
<A>
<B>
<Teacher name="Liucy">
C++
</Teacher>
<Teacher name="Huxz">
Java
</Teacher>
</B>
</A>
</Root>


ParseXmlwithDom1.java

import org.w3c.dom.*;import javax.xml.parsers.*;public class ParseXmlwithDom1 {public static void main(String[] args) throws Exception{DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();DocumentBuilder builder=dbf.newDocumentBuilder();Document doc=builder.parse("example1.xml");/*Element root=doc.getDocumentElement();*///NodeList nl=root.getChildNodes();NodeList nl=doc.getElementsByTagName("Teacher");for(int i=0;i<nl.getLength();i++){Node n=nl.item(i);/*short s=n.getNodeType();if (s==Node.ELEMENT_NODE){*/System.out.print("Element:");Element e=(Element)n;System.out.print(e.getTagName());System.out.print(" name="+e.getAttribute("name"));System.out.println("  textContent="+e.getTextContent().trim());/*}if (s==Node.TEXT_NODE){System.out.print("Text:");Text t=(Text)n;String text=t.getTextContent().trim();System.out.println(text);}*/}}}


控制台输出:
Element:Teacher name=Liucy  textContent=C++
Element:Teacher name=Huxz  textContent=Java



SAX解析:
<Root>
<Teacher1 name="Liucy">
C++
</Teacher1>
<Teacher2 name="Huxz">
Java
</Teacher2>
</Root>


ParseXmlwithSAX.java
import javax.xml.parsers.*;import org.xml.sax.*;import org.xml.sax.helpers.*;import static java.lang.System.*;public class ParseXmlwithSAX {public static void main(String[] args) throws Exception {SAXParserFactory fact=SAXParserFactory.newInstance();SAXParser parser=fact.newSAXParser();DefaultHandler dh=new MyHandler();parser.parse("example2.xml",dh);}}class MyHandler extends DefaultHandler{public void characters(char[] cs, int start, int length) throws SAXException {String str=new String(cs,start,length).trim();if (str.length()==0) return;out.println("处理文本 "+str);}public void endDocument() throws SAXException {out.println("文档结束");}public void endElement(String uri, String localName, String qName) throws SAXException {out.println("标记结束 "+qName);}public void startDocument() throws SAXException {out.println("文档开始");}public void startElement(String uri, String localName, String qName, Attributes as) throws SAXException {out.println("标记开始 "+qName);if (as.getLength()!=0) {String value=as.getValue("name");out.println("name="+value);}}}



控制台输出:
文档开始
标记开始 Root
标记开始 Teacher1
name=Liucy
处理文本 C++
标记结束 Teacher1
标记开始 Teacher2
name=Huxz
处理文本 Java
标记结束 Teacher2
标记结束 Root
文档结束

热点排行