为了账号安全,请及时绑定邮箱和手机立即绑定

为什么生成不了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)
*/


正在回答

4 回答

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)

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


0 回复 有任何疑惑可以回复我~

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

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

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

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

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

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

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

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

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

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

0 回复 有任何疑惑可以回复我~

你的if条件判断有问题

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

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

应该改成

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

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


因为  && 是个短路与判断

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

name year author 都得改



0 回复 有任何疑惑可以回复我~

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

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

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

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信