package?SAX;
import?java.io.File;
import?java.io.FileNotFoundException;
import?java.io.FileOutputStream;
import?java.io.IOException;
import?java.util.ArrayList;
import?handler.SaxParserHandler;
import?javax.naming.spi.DirStateFactory.Result;
import?javax.xml.parsers.ParserConfigurationException;
import?javax.xml.parsers.SAXParser;
import?javax.xml.parsers.SAXParserFactory;
import?javax.xml.transform.OutputKeys;
import?javax.xml.transform.Transformer;
import?javax.xml.transform.TransformerConfigurationException;
import?javax.xml.transform.sax.SAXTransformerFactory;
import?javax.xml.transform.sax.TransformerHandler;
import?javax.xml.transform.stream.StreamResult;
import?org.xml.sax.SAXException;
import?org.xml.sax.helpers.AttributesImpl;
import?Entity.Book;
public?class?SaxTest?{
?public?static?void?main(String[]?args)?{
??//?TODO?Auto-generated?method?stub
????SaxTest?st=new?SaxTest();
???//?st.parseXML();
????st.createXML();
??
?}
?
?public?ArrayList<Book>?parseXML(){
??//獲取一個(gè)SAXParserFactory的實(shí)例
??SAXParserFactory?factory=SAXParserFactory.newInstance();
??SaxParserHandler?handler=null;
??try?{
????//通過factory獲取一個(gè)saxpaser的實(shí)例
????SAXParser?parser=factory.newSAXParser();
????//uri是路徑???創(chuàng)建SAXhandler對(duì)象
????handler=new?SaxParserHandler();
????parser.parse("新建文本文檔.xml",?handler);
//????System.out.println(handler.getBooklist().size());
//????for?(Book?book?:?handler.getBooklist())?{
//?????System.out.println(book.getAuthor());
//?????System.out.println("====完成====");
//????}
??}?catch?(ParserConfigurationException?e)?{
???//?TODO?Auto-generated?catch?block
???e.printStackTrace();
??}?catch?(SAXException?e)?{
???//?TODO?Auto-generated?catch?block
???e.printStackTrace();
??}catch?(IOException?e)?{
???//?TODO?Auto-generated?catch?block
???e.printStackTrace();
??}
??return?handler.getBooklist();??
?}
?
?public?void?createXML(){
??ArrayList<Book>?booklist?=parseXML();
??//生成xml
??//創(chuàng)建一個(gè)SAXtransformerfactory對(duì)象
??SAXTransformerFactory?tff=(SAXTransformerFactory)?SAXTransformerFactory.newInstance();
??try?{
???//創(chuàng)建transforemerhandler對(duì)象。
???TransformerHandler?handler=?tff.newTransformerHandler();
???//創(chuàng)建transformer對(duì)象
???Transformer?tr=?handler.getTransformer();
???//通過transformer對(duì)xml文件進(jìn)行設(shè)置
???tr.setOutputProperty(OutputKeys.ENCODING,?"utf-8");?//設(shè)置編碼???必須在setresult之前
???tr.setOutputProperty(OutputKeys.INDENT,?"yes");????//設(shè)置換行
???//創(chuàng)建result對(duì)象
???File?f=?new?File("src/res/books.xml");
???if(!f.exists()){
????try?{
?????f.createNewFile();
????}?catch?(IOException?e)?{
?????//?TODO?Auto-generated?catch?block
?????e.printStackTrace();
????}
???}
?
???//創(chuàng)建result對(duì)象并且使其與handler關(guān)聯(lián)
???javax.xml.transform.Result?result=new?StreamResult(new?FileOutputStream(f));
???handler.setResult(result);
???
???//利用handler對(duì)xml文件進(jìn)行內(nèi)容的編寫
???//打開document
???handler.startDocument();
???AttributesImpl?attr=new?AttributesImpl();
???
???//startelement是創(chuàng)建的節(jié)點(diǎn)????characters是創(chuàng)建節(jié)點(diǎn)的值
???
???handler.startElement("",?"",?"bookstore",?attr);
???
???for?(Book?book?:?booklist)?{
????attr.clear();
????attr.addAttribute("",?"",?"id",?"",?book.getId());
????handler.startElement("",?"",?"book",?attr);
????
????attr.clear();
????handler.startElement("",?"",?"name",?attr);
????handler.characters(book.getName().toCharArray(),0?,book.getName().length()?);
????handler.endElement("",?"",?"name");
????
????attr.clear();
????handler.startElement("",?"",?"year",?attr);
????handler.characters(book.getYear().toCharArray(),0?,book.getYear().length()?);
????handler.endElement("",?"",?"year");
????
????attr.clear();
????handler.startElement("",?"",?"author",?attr);
????handler.characters(book.getAuthor().toCharArray(),0?,book.getAuthor().length()?);
????handler.endElement("",?"",?"author");
????
????handler.endElement("",?"",?"book");??
???}
???
???handler.endElement("",?"",?"bookstore");
???
???
???//關(guān)閉document
???handler.endDocument();
???
???}?catch?(FileNotFoundException?e)?{
????//?TODO?Auto-generated?catch?block
????e.printStackTrace();??
??}?catch?(TransformerConfigurationException?e)?{
???//?TODO?Auto-generated?catch?block
???e.printStackTrace();
??}catch?(SAXException?e)?{
???//?TODO?Auto-generated?catch?block
???e.printStackTrace();
??}
?}
}
/*還報(bào)錯(cuò)了?
?com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException:?Invalid?byte?1?of?1-byte?UTF-8?sequence.
?at?com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.invalidByte(UTF8Reader.java:684)
?at?com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(UTF8Reader.java:554)
?at?com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(XMLEntityScanner.java:1742)
?at?com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.peekChar(XMLEntityScanner.java:487)
?at?com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2687)
?at?com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:648)
?at?com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:511)
?at?com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:808)
?at?com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737)
?at?com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:119)
?at?com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205)
?at?com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)
?at?javax.xml.parsers.SAXParser.parse(SAXParser.java:395)
?at?javax.xml.parsers.SAXParser.parse(SAXParser.java:277)
?at?SAX.SaxTest.parseXML(SaxTest.java:46)
?at?SAX.SaxTest.createXML(SaxTest.java:66)
?at?SAX.SaxTest.main(SaxTest.java:33)
*/
2016-12-02
上面是我寫的函數(shù);報(bào)的錯(cuò)誤是空指針異常。
2017-05-15
上一個(gè)回答不好,我在回答一下,改還是那樣改
但是邏輯是因?yàn)?amp;&是個(gè)短路與
?if?((book.getLanguage()?!=?null)
????????????????????????&&?!book.getLanguage().trim().equals(""))
這樣判斷首先判斷是不是空,如果是空直接整個(gè)if就是false了if里的代碼就不執(zhí)行了
?if?(!book.getLanguage().trim().equals("")
????????????????????????&&?(book.getLanguage()?!=?null)){}
這樣判斷的話程序先會(huì)判斷book.getLanguage()是不是個(gè)空格,用的equals方法
相當(dāng)于兩個(gè)對(duì)象比較,第一本書都沒有Language,怎么和空格比呢,
所以程序直接報(bào)了空指針異常,程序就結(jié)束了
2017-05-15
你的if條件判斷有問題
?if?(!book.getYear().trim().equals("")
????????????????????????&&?(book.getYear()?!=?null)){}這樣判斷是不對(duì)的
應(yīng)該改成
?if?((book.getYear()?!=?null)
????????????????????????&&?!book.getYear().trim().equals(""))
因?yàn)??&& 是個(gè)短路與判斷
你得先判斷是不是空再 && 是不是等于空格
name year author 都得改
2016-12-02
我根據(jù)課程編寫SAX方式寫入xml文件也報(bào)錯(cuò);在?handler.startElement("",?"",?"name",?attr);這句沒有執(zhí)行,不明原因。