黑马程序员技术交流社区

标题: xml [打印本页]

作者: duanhuilin    时间: 2012-10-24 14:40
标题: xml
xml文档该如何使用流对象操作读写?

作者: 谭立文    时间: 2012-10-24 14:54
package com.wenfengkeji.utils;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

public class XmlUtils
{
        private static String xmlPath;
        static
        {
                xmlPath = XmlUtils.class.getClassLoader().getResource("users.xml").getPath();
                System.out.println(xmlPath);
        }
        public static Document getDocument() throws DocumentException
        {
                SAXReader reader = new SAXReader();
                return reader.read(new File(xmlPath));
        }
        public static void write2XML(Document document) throws IOException
        {
                OutputFormat format = OutputFormat.createPrettyPrint();
                format.setEncoding("UTF-8");
                XMLWriter writer = new XMLWriter(new FileOutputStream(xmlPath), format);
                writer.write(document);
                writer.close();
        }
}
这是用的第三方库来解析的,java也提供了对xml文件的操作,与之有关的包在
javax.xml.parsers 下感兴趣可以研究一下。
作者: duanhuilin    时间: 2012-10-24 14:56
领教了,谢谢!!
作者: 范贞亮    时间: 2012-10-24 15:22
SAX ,事件驱动。当解析器发现元素开始、元素结束、文本、文档的开始或结束等时,发送事件,程序员编写响应这些事件的代码,保存数据。优点:不用事先调入整个文档,占用资源少;SAX解析器代码比DOM解析器代码小,适于Applet,下载。缺点:不是持久的;事件过后,若没保存数据,那么数据就丢了;无状态性;从事件中只能得到文本,但不知该文本属于哪个元素;使用场合:Applet;只需XML文档的少量内容,很少回头访问;机器内存少;
看如下实例:
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.Locator;
import org.xml.sax.ContentHandler;
import org.xml.sax.InputSource;
import org.xml.sax.helpers.DefaultHandler;
import java.io.IOException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;


class TestSAX extends DefaultHandler{
   
    private StringBuffer buf;
    private String str;
    public TestSAX(){
        super();
    }
   
//    public void setDocumentLocator(Locator locator){}
   
    public void startDocument() throws SAXException{
        buf=new StringBuffer();
        System.out.println("*******开始解析文档*******");
    }
   
    public void endDocument() throws SAXException{        
        System.out.println("*******文档解析结束*******");
    }
   
    public void startPrefixMapping( String prefix, String uri ){
        System.out.println(" 前缀映射: " + prefix +" 开始!"+ " 它的URI是:" + uri);
    }
   
    public void endPrefixMapping( String prefix ){
        System.out.println(" 前缀映射: "+prefix+" 结束!");
    }
   
//    public void processingInstruction( String target, String instruction )throws SAXException{}
   
//    public void ignorableWhitespace( char[] chars, int start, int length ) throws SAXException {}
   
//    public void skippedEntity( String name ) throws SAXException {}
   
    public void startElement(String namespaceURI,String localName,String qName,Attributes atts){
        System.out.println("*******开始解析元素*******");   
        System.out.println("元素名"+qName);        
        for(int i=0;i<atts.getLength();i++){
            System.out.println("元素名"+atts.getLocalName(i)+"属性值"+atts.getValue(i));
        }
    }
   
    public void endElement(String namespaceURI,String localName,String fullName )throws SAXException{
//        buf.trimToSize();
        str = buf.toString();
        System.out.println("buf = "+buf+" || length = "+buf.length());
        System.out.println("str = "+str.trim()+" || length = "+str.trim().length());
        buf.delete(0,buf.length());
        System.out.println("******"+namespaceURI+"元素解析结束"+localName+"********"+fullName);
    }
   
    public void characters( char[] chars, int start, int length )throws SAXException{
        //将元素内容累加到StringBuffer中
        buf.append(chars,start,length);
    }
   
    public static void main(String args[]){
        try{
            SAXParserFactory sf = SAXParserFactory.newInstance();
            SAXParser sp = sf.newSAXParser();
            TestSAX testsax=new TestSAX();
            sp.parse(new InputSource("test1.xml"),testsax);
        }catch(IOException e){
            e.printStackTrace();
        }catch(SAXException e){
            e.printStackTrace();
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}
xml文件,我读的时候有错误,用了自己的,希望其他人比我幸运!
代码:
<?xml version="1.0" encoding="GB2312"?>
<row>
<person>
<name>王小明</name>
<college>信息学院</college>
<telephone>6258113</telephone>
<notes>男,1955年生,博士,95年调入海南大学</notes>
</person>
</row>




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2