java--通過sax方式解析xml檔案的簡單例項
阿新 • • 發佈:2019-01-30
1.重寫的繼承自DefaultHandler的方法,部分程式碼如下:
解析方法如下:@Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { // TODO Auto-generated method stub super.startElement(uri, localName, qName, attributes); //當屬性名為book時開始解析 if(qName.equals("book")){ System.out.println("---開始對第"+bookindex+"書進行解析---"); int a=attributes.getLength(); //輸出屬性名: System.out.println("屬性名為:"+qName); //遍歷屬性 for(int i=0;i<a;i++){ System.out.println("屬性值為:"+attributes.getValue(i)); } }else{ if(!qName.equals("bookstore")){ System.out.print("節點名為:"+qName+" "); } } } @Override public void endElement(String uri, String localName, String qName) throws SAXException { // TODO Auto-generated method stub if (qName.equals("name")){ System.out.println("-------------------"+value); b.setName(value); System.out.println("新增成功"); } if(qName.equals("author")){ b.setAuthor(value); } if(qName.equals("year")){ b.setYear(value); } super.endElement(uri, localName, qName); if(qName.equals("book")){ System.out.println("---結束對第"+bookindex+"書進行解析---"); booklist.add(b); //new 一下,清空已有的物件屬性 b= new book(); System.out.println("新增的書的名字:"+b.getName()); bookindex++; } } //重寫開始解析和結束解析的方法 @Override public void startDocument() throws SAXException { // TODO Auto-generated method stub super.startDocument(); System.out.println("開始解析"); } @Override public void endDocument() throws SAXException { // TODO Auto-generated method stub super.endDocument(); System.out.println("結束解析"); } /* (non-Javadoc) * @see org.xml.sax.helpers.DefaultHandler#characters(char[], int, int) */ @Override public void characters(char[] ch, int start, int length) throws SAXException { // TODO Auto-generated method stub super.characters(ch, start, length); value= new String(ch, start, length); //如果去掉空格部為空 if(!value.trim().equals("")){ System.out.println("節點值為:"+value); } }
public static void createXml() throws Exception{ ArrayList<book> booklist=jiexi(); //開始建立xml檔案,前幾步都是一樣的 SAXTransformerFactory stf=(SAXTransformerFactory)SAXTransformerFactory.newInstance(); TransformerHandler hander=stf.newTransformerHandler(); //得到一個Transformer物件 Transformer tf=hander.getTransformer(); //然後進行一些xml檔案的設定 //設定換行 tf.setOutputProperty(OutputKeys.INDENT, "yes"); //設定xml檔案的字元編碼 tf.setOutputProperty(OutputKeys.ENCODING, "utf-8"); //建立一個result物件並與hander進行關聯 File file= new File("book2.xml"); if(!file.exists()){ file.createNewFile(); System.out.println("檔案建立成功"); } Result result = new StreamResult(new FileOutputStream(file)); hander.setResult(result); //接下來利用hander物件對xml進行內容的編寫 //先開始document AttributesImpl attr= new AttributesImpl(); hander.startDocument(); hander.startElement("", "", "bookstore", attr); //遍歷booklist,並把它寫入xml節點 int i=1; for(book bo:booklist){ attr.clear(); //新增一個屬性到attr attr.addAttribute("", "", "id", "",i+""); //i+""或者Integer.toString(i)將int轉換成字串 hander.startElement("", "", "book", attr); //attr表示屬性值 //當兩本書的節點名不一樣時,加一份判斷,如果得到的值不為空並且去掉空格部位空時才進行新增,以下新增一樣 if(bo.getName()!=null && !bo.getName().trim().equals("")){ attr.clear(); hander.startElement("", "", "name", attr); //新增name中的文字 hander.characters(bo.getName().toCharArray(), 0, bo.getName().length()); hander.endElement("", "", "name"); } //新增作者 attr.clear(); hander.startElement("", "", "author", attr); hander.characters(bo.getAuthor().toCharArray(), 0,bo.getAuthor().length()); hander.endElement("", "", "author"); //添加出版年份 attr.clear(); hander.startElement("", "", "year", attr); hander.characters(bo.getYear().toCharArray(), 0, bo.getYear().length()); hander.endElement("", "", "year"); //結束book節點 hander.endElement("", "", "book"); i++; } hander.endElement("", "", "bookstore"); hander.endDocument(); }