问答详情
源自:3-3 生成带文本的子节点

为什么生成不了book,name这些节点?执行后只有bookstore

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(){
  //获取一个SAXParserFactory的实例
  SAXParserFactory factory=SAXParserFactory.newInstance();
  SaxParserHandler handler=null;
  try {
    //通过factory获取一个saxpaser的实例
    SAXParser parser=factory.newSAXParser();
    //uri是路径   创建SAXhandler对象
    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
  //创建一个SAXtransformerfactory对象
  SAXTransformerFactory tff=(SAXTransformerFactory) SAXTransformerFactory.newInstance();
  try {
   //创建transforemerhandler对象。
   TransformerHandler handler= tff.newTransformerHandler();
   //创建transformer对象
   Transformer tr= handler.getTransformer();
   //通过transformer对xml文件进行设置
   tr.setOutputProperty(OutputKeys.ENCODING, "utf-8"); //设置编码   必须在setresult之前
   tr.setOutputProperty(OutputKeys.INDENT, "yes");    //设置换行
   //创建result对象
   File f= new File("src/res/books.xml");
   if(!f.exists()){
    try {
     f.createNewFile();
    } catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
   }
 
   //创建result对象并且使其与handler关联
   javax.xml.transform.Result result=new StreamResult(new FileOutputStream(f));
   handler.setResult(result);
   
   //利用handler对xml文件进行内容的编写
   //打开document
   handler.startDocument();
   AttributesImpl attr=new AttributesImpl();
   
   //startelement是创建的节点    characters是创建节点的值
   
   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");
   
   
   //关闭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();
  }
 }
}
/*还报错了 
 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-01 21:55

个回答

  • mumu160
    2016-12-02 14:55:46
    已采纳

    public void SAXWriteXml() {
    		List<Book> bookList = SAXReadXml();
    		// 1 创建SAXTransformerFactory类的对象
    		SAXTransformerFactory stff = (SAXTransformerFactory) SAXTransformerFactory
    				.newInstance();
    		try {
    			// 2通过SAXTransformerFactory对象创建一个TransformerHandler对象
    			TransformerHandler handler = stff.newTransformerHandler();
    			// 3通过handler创建Transformer对象
    			Transformer tf = handler.getTransformer();
    			// 4通过Transformer对象对生成的xml文件进行设置
    			tf.setOutputProperty(OutputKeys.ENCODING, "utf-8");
    			tf.setOutputProperty(OutputKeys.INDENT, "yes");
    			// 5创建一个Result对象
    			File file = new File("source/shuji.xml");
    			if (!file.exists()) {
    				file.createNewFile();
    			}
    			// 6创建Result对象,result与handler关联
    			Result result = new StreamResult(new FileOutputStream(file));
    			handler.setResult(result);
    			// 7利用Handler对象进行xml文件内容的填充
    			// 打开document文档
    			handler.startDocument();
    			AttributesImpl atts = new AttributesImpl();
    			handler.startElement("", "", "bookstore", atts);
    			for (Book book : bookList) {
    				atts.clear();
    				atts.addAttribute("", "", "id", "", book.getId());
    				handler.startElement("", "", "book", atts);
    				atts.clear();
    				// 创建name节点
    				if ((book.getName() != null)
    						&& !book.getName().trim().equals("")) {
    					atts.clear();
    					System.out.println("+++++name+++++");
    					handler.startElement("", "", "name", atts);//这里没有执行
    					System.out.println("+++++name+++++");
    					handler.characters(book.getName().toCharArray(), 0, book
    							.getName().length());
    					handler.endElement("", "", "name");
    					
    				}
    				if (!book.getAuthor().trim().equals("")
    						&& (book.getAuthor() != null)) {
    					atts.clear();
    					System.out.println("+++++author+++++");
    					handler.startElement("", "", "author", atts);
    					handler.characters(book.getAuthor().toCharArray(), 0, book
    							.getAuthor().length());
    					handler.endElement("", "", "author");
    				}
    				if (!book.getYear().trim().equals("")
    						&& (book.getYear() != null)) {
    					atts.clear();
    					handler.startElement("", "", "year", atts);
    					handler.characters(book.getYear().toCharArray(), 0, book
    							.getYear().length());
    					handler.endElement("", "", "year");
    				}
    				if (!book.getPrice().trim().equals("")
    						&& (book.getPrice() != null)) {
    					atts.clear();
    					handler.startElement("", "", "price", atts);
    					handler.characters(book.getPrice().toCharArray(), 0, book
    							.getPrice().length());
    					handler.endElement("", "", "price");
    				}
    				if (!book.getLanguage().trim().equals("")
    						&& (book.getLanguage() != null)) {
    					atts.clear();
    					handler.startElement("", "", "language", atts);
    					handler.characters(book.getLanguage().toCharArray(), 0,
    							book.getLanguage().length());
    					handler.endElement("", "", "language");
    				}
    
    				handler.endElement("", "", "book");
    			}
    
    			handler.endElement("", "", "bookstore");
    			// 关闭document
    			handler.endDocument();
    		} catch (TransformerConfigurationException e) {
    			e.printStackTrace();
    		} catch (FileNotFoundException e) {
    			e.printStackTrace();
    		} catch (IOException e) {
    			e.printStackTrace();
    		} catch (SAXException e) {
    			e.printStackTrace();
    		}
    	}
    	//异常
    	Exception in thread "main" java.lang.NullPointerException
    	at com.sun.org.apache.xml.internal.serializer.ToStream.writeAttrString(ToStream.java:1967)
    	at com.sun.org.apache.xml.internal.serializer.ToStream.processAttributes(ToStream.java:1947)
    	at com.sun.org.apache.xml.internal.serializer.ToStream.closeStartTag(ToStream.java:2443)
    	at com.sun.org.apache.xml.internal.serializer.ToStream.startElement(ToStream.java:1783)
    	at com.sun.org.apache.xml.internal.serializer.ToUnknownStream.startElement(ToUnknownStream.java:548)
    	at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerHandlerImpl.startElement(TransformerHandlerImpl.java:267)
    	at com.live.imooc.test.SAXTest.SAXWriteXml(SAXTest.java:70)
    	at com.live.imooc.test.SAXTest.main(SAXTest.java:31)

    上面是我写的函数;报的错误是空指针异常。


  • 慕仰0180559
    2017-05-15 12:09:55

    上一个回答不好,我在回答一下,改还是那样改

    但是逻辑是因为&&是个短路与

     if ((book.getLanguage() != null)

                            && !book.getLanguage().trim().equals(""))

    这样判断首先判断是不是空,如果是空直接整个if就是false了if里的代码就不执行了

     if (!book.getLanguage().trim().equals("")

                            && (book.getLanguage() != null)){}

    这样判断的话程序先会判断book.getLanguage()是不是个空格,用的equals方法

    相当于两个对象比较,第一本书都没有Language,怎么和空格比呢,

    所以程序直接报了空指针异常,程序就结束了

  • 慕仰0180559
    2017-05-15 11:51:29

    你的if条件判断有问题

     if (!book.getYear().trim().equals("")

                            && (book.getYear() != null)){}这样判断是不对的

    应该改成

     if ((book.getYear() != null)

                            && !book.getYear().trim().equals(""))


    因为  && 是个短路与判断

    你得先判断是不是空再 && 是不是等于空格

    name year author 都得改



  • mumu160
    2016-12-02 14:53:19

    我根据课程编写SAX方式写入xml文件也报错;在 handler.startElement("", "", "name", attr);这句没有执行,不明原因。