用的是DOM,代码丑了一点,将就着看吧,不过还是能用的

  1  import  java.io.File;
  2  import  java.io.FileOutputStream;
  3  import  java.io.IOException;
  4  import  java.io.PrintWriter;
  5  import  javax.xml.parsers.DocumentBuilder;
  6  import  javax.xml.parsers.DocumentBuilderFactory;
  7  import  javax.xml.parsers.ParserConfigurationException;
  8  import  javax.xml.transform.OutputKeys;
  9  import  javax.xml.transform.Transformer;
 10  import  javax.xml.transform.TransformerException;
 11  import  javax.xml.transform.TransformerFactory;
 12  import  javax.xml.transform.dom.DOMSource;
 13  import  javax.xml.transform.stream.StreamResult;
 14  import  org.w3c.dom.Document;
 15  import  org.w3c.dom.Element;
 16  import  org.w3c.dom.Node;
 17  import  org.w3c.dom.NodeList;
 18  import  org.xml.sax.SAXException;
 19 
 20  public   class  ChatRecord {
 21 
 22       private  Document document;    
 23       private  String filename;   
 24      Element root;
 25      
 26       public  ChatRecord (String name)
 27      {
 28          filename  =  name;
 29      }
 30      
 31       /*
 32       * If there is no chat record, we should start a new one
 33       * But make sure that this method will only be executed ONCE!!!
 34        */
 35       public   void  startNewRecord()  throws  ParserConfigurationException
 36      {
 37          DocumentBuilderFactory factory  =  DocumentBuilderFactory.newInstance();    
 38          DocumentBuilder builder  =  factory.newDocumentBuilder();  
 39          document  =  builder.newDocument();          
 40          root  =  document.createElement( " ChatRecord " );    
 41          document.appendChild(root);  
 42          toSave();
 43      }
 44 
 45       /*
 46       * Save the XML to disk
 47        */
 48       public   void  toSave(){    
 49           try {    
 50            TransformerFactory tf  =  TransformerFactory.newInstance();    
 51            Transformer transformer  =  tf.newTransformer();    
 52            DOMSource source  =   new  DOMSource(document);    
 53            transformer.setOutputProperty(OutputKeys.ENCODING, " GB2312 " );    
 54             // transformer.setOutputProperty(OutputKeys.INDENT,"yes");    
 55            PrintWriter pw  =   new  PrintWriter( new  FileOutputStream(filename));
 56            StreamResult result  =   new  StreamResult(pw);    
 57            transformer.transform(source,result);  
 58            pw.close();
 59            }    
 60           catch (TransformerException mye){    
 61            mye.printStackTrace();    
 62          }    
 63           catch (IOException exp){    
 64            exp.printStackTrace();    
 65          }    
 66      }  
 67     
 68      
 69       /*
 70       * Read the chat record from a XML
 71        */
 72       public   void  print()
 73      {
 74            try  {
 75               
 76                //  create DocumentBuilderFactory
 77               DocumentBuilderFactory factory  =  
 78                  DocumentBuilderFactory.newInstance();
 79 
 80                //  create DocumentBuilder
 81               DocumentBuilder builder  =  factory.newDocumentBuilder();
 82 
 83                //  obtain document object from XML document
 84               Document document  =  builder.parse( 
 85                   new  File( filename) );
 86 
 87                //  get root node
 88               Node root  =  document.getDocumentElement();
 89 
 90               NodeList childNodes  =  root.getChildNodes();
 91               Node currentNode;  
 92 
 93                for  (  int  i  =   0 ; i  <  childNodes.getLength(); i ++  ) {
 94               
 95                  currentNode  =  childNodes.item( i );
 96 
 97                   //  print node name of each child element
 98                  System.out.println( currentNode.getNodeName()  +   "   "   +  currentNode.getFirstChild().getNodeValue());
 99               }
100 
101            }
102 
103             //  handle exception creating DocumentBuilder
104             catch  ( ParserConfigurationException parserError ) {
105               System.err.println(  " Parser Configuration Error "  );
106               parserError.printStackTrace();
107            }
108 
109             //  handle exception reading data from file
110             catch  ( IOException fileException ) {
111               System.err.println(  " File IO Error "  );
112               fileException.printStackTrace();
113            }
114 
115             //  handle exception parsing XML document
116             catch  ( SAXException parseException ) {
117               System.err.println(  " Error Parsing Document "  );
118               parseException.printStackTrace();
119            }
120      }
121      
122      
123       /*
124       * If there is already a chat record
125       * use this method to update it
126        */
127       public   void  update(String time, String sender, String receiver, String textcontent)
128      {
129           try  {
130           
131            //  create DocumentBuilderFactory
132           DocumentBuilderFactory factory  =  DocumentBuilderFactory.newInstance();
133 
134            //  create DocumentBuilder
135           DocumentBuilder builder  =  factory.newDocumentBuilder();
136 
137            //  obtain document object from XML document
138           document  =  builder.parse( 
139               new  File( filename ) );
140 
141          Node thisroot  =  document.getFirstChild();
142           Element mytime  =  document.createElement( " Time " );    
143          mytime.appendChild(document.createTextNode(time));    
144          thisroot.appendChild(mytime);
145 
146          Element Sender  =  document.createElement( " Sender " );    
147          Sender.appendChild(document.createTextNode(sender));    
148          thisroot.appendChild(Sender);
149 
150          Element Receiver  =  document.createElement( " Receiver " );    
151          Receiver.appendChild(document.createTextNode(receiver));    
152          thisroot.appendChild(Receiver);
153 
154          Element content  =  document.createElement( " Content " );    
155          content.appendChild(document.createTextNode(textcontent));    
156          thisroot.appendChild(content);  
157           
158          }
159        //  handle exception creating DocumentBuilder
160        catch  ( ParserConfigurationException parserError ) {
161          System.err.println(  " Parser Configuration Error "  );
162          parserError.printStackTrace();
163       }
164 
165        //  handle exception reading data from file
166        catch  ( IOException fileException ) {
167          System.err.println(  " File IO Error "  );
168          fileException.printStackTrace();
169       }
170 
171        //  handle exception parsing XML document
172        catch  ( SAXException parseException ) {
173          System.err.println(  " Error Parsing Document "  );
174          parseException.printStackTrace();
175       }    
176      }
177  }
178 

说说问题吧,因为要写一个聊天记录的XML,就好象MSN的那个聊天记录一样,于是当然要不断的续写

但是我没找到DOM的API来完成这个功能,找了很久很久,想了很多办法

最后还是用了最SB的办法,parseXML文件,append新的Element,然后重新写出去

但是这样当XML文件打了一会,为了写一条聊天记录就要进行大量的IO操作,这样现在是不合理的

其实可以直接在文件里面println,这样就不用进行那么多无用的读写了

但是我想DOM应该不至于连这么有用的API都没有吧?

其实我看DOM的API也就一个晚上,而且对DOM整体的架构还不是很了解

不知道里面的parse是怎么实现的,或许人家已经想到了我这个问题……

不知道,反正现在只能暂时这样实现了,如果真的是为了性能的考虑,那倒是可以自己写一个println的方法,直接把新的元素追加上去

有空去好好学学XML吧

JAVA还是基本功不够好啊,很多诸如I/O Stream之类的东西,里面的类都还不是很清楚

当初看得Design Pattern现在全忘光了……,真是对不起我的媳妇儿啊

Anyway,有时间再说吧……