恩恩是的,挺奇妙的吧,嘿嘿,可以一起交流 一起学习
如果你是想自己输入字符串加进去的话,把他toCharArray再用之前的方法加进去就好了,区间就是0到length-1
不会呀,代码错了?
既然是空值<name/>和<name></name>是一样的,没有必要纠结这个吧
我个人操作是在导入的XML文件中读取的数据,编辑数据也只是在这个文件中进行操作.
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)
上面是我写的函数;报的错误是空指针异常。
我之前也出现过这个问题;你是不是在for语句里面释放了book = null;然后没有new再调用就会出现这个问题.
去除空格与换行符
package com.imooc.test; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.ArrayList; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import javax.xml.transform.OutputKeys; import javax.xml.transform.Result; 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.SAXParseException; import org.xml.sax.helpers.AttributesImpl; public class SaxTest { public ArrayList<Book> xmlParse(){ SAXParserFactory factory=SAXParserFactory.newInstance(); HandlerTest handler=null; try { SAXParser parser=factory.newSAXParser(); handler=new HandlerTest(); parser.parse("f:\\books.xml",handler); /* System.out.println("----共有"+handler.getBookList().size()+"本书-----"); for(Book book1:handler.getBookList()){//遍历booList中的内容 System.out.println("===========开始=========="); System.out.println(book1.getID()); System.out.println(book1.getName()); System.out.println(book1.getAuthor()); System.out.println(book1.getYear()); System.out.println(book1.getPrice()); System.out.println(book1.getLanguage()); 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 xmlCreate(){ ArrayList<Book> booklist=xmlParse(); SAXTransformerFactory tff=(SAXTransformerFactory) SAXTransformerFactory.newInstance(); try { TransformerHandler handler=tff.newTransformerHandler(); Transformer tf=handler.getTransformer(); tf.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); tf.setOutputProperty(OutputKeys.INDENT, "yes"); File f=new File("src/res/newbooks.xml"); if(!f.exists()){ f.createNewFile(); } Result result=new StreamResult(new FileOutputStream(f)); handler.setResult(result); handler.startDocument(); AttributesImpl attr=new AttributesImpl(); handler.startElement("","","bookStore",attr); for(Book book:booklist){ attr.clear(); attr.addAttribute("", "", "id","",book.getID()); handler.startElement("","","book",attr); if(book.getName()!=null&&!book.getName().trim().equals("")){ attr.clear(); handler.startElement("", "","name", attr); handler.characters(book.getName().toCharArray(), 0,book.getName().length()); handler.endElement("","","name"); } if(!book.getAuthor().equals(null)&&!book.getAuthor().trim().equals("")){ attr.clear(); handler.startElement("", "","author", attr); handler.characters(book.getAuthor().toCharArray(), 0,book.getAuthor().length()); handler.endElement("","","author"); } if(book.getYear()!=null&&!book.getYear().trim().equals("")){ attr.clear(); handler.startElement("", "","year", attr); handler.characters(book.getYear().toCharArray(), 0,book.getYear().length()); handler.endElement("","","year"); } if(book.getLanguage()!=null&&!book.getLanguage().trim().equals("")){ attr.clear(); handler.startElement("", "","language", attr); handler.characters(book.getLanguage().toCharArray(), 0,book.getLanguage().length()); handler.endElement("","","language"); } if(book.getPrice()!=null&&!book.getPrice().trim().equals("")){ attr.clear(); handler.startElement("", "","price", attr); handler.characters(book.getPrice().toCharArray(), 0,book.getPrice().length()); handler.endElement("","","price"); } handler.endElement("","","book"); } handler.endElement("","","bookStore"); handler.endDocument(); } catch (TransformerConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); }catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static void main(String[] args) { // TODO Auto-generated method stub SaxTest test=new SaxTest(); test.xmlCreate(); } }
代码的位置放置不对
找到了,多加了一句handler.endElement
获取的某个对象为null时,调用该对象的方法就会报空指针,检查一下代码,看哪个对象为空。