1. 程式人生 > >java--通過sax方式解析xml檔案的簡單例項

java--通過sax方式解析xml檔案的簡單例項

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();
	}