当前位置: 代码迷 >> XML/SOAP >> XML SAX 解析,该怎么处理
  详细解决方案

XML SAX 解析,该怎么处理

热度:649   发布时间:2012-02-29 16:44:10.0
XML SAX 解析
我正在试图解析一个大概600M的XML文档.只解析其中一部分元素.
很奇怪,如果XML文档不大的时候,我的程序完全可以运行完成.
如果XML文档很大.我的程序一直没有反应.但不报错,也没有内存溢出的错误...
老师说,如果XML文档600 M,解析的时间可能会超过几十分钟,可是我苦苦等了半个小时.也没有结束解析.
请帮我分析
我的程序如下:
package com.wsy;

import java.util.*;
import java.io.FileReader;
import java.io.IOException;

import javax.xml.parsers.ParserConfigurationException;

import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import javax.xml.parsers.SAXParser;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.SAXParserFactory;


import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

public class Xml_parser extends DefaultHandler{

String m="";
//Stack<String> tagsStack=new Stack<String>();
ArrayList<convert> author=new ArrayList<convert>(20);
ArrayList<convert> publikation=new ArrayList<convert>(20);
int markierung=0;
 
// authors s=null;
//calling by Begining of the file
public void startDocument() throws SAXException {
 
System.out.println("startDocument: ");
 
}

//calling by ending of the file
public void endDocument() throws SAXException {
 
System.out.println("enddocument: ");
}
 
//calling by beginging of tag
public void startElement(String uri,
  String localName,
  String qName,
  Attributes attributes) throws SAXException{
if(qName.equals("author")||qName.equals("editor")||qName.equals("book")||qName.equals("incollection")||qName.equals("title")) 
m=qName;
//else
//tagsStack.pop();
 

 
}
//calling by ending of tag
public void endElement(String namespaceURI,String localName,String qName)throws SAXException{
 
while(!m.equals(""))
{m="";}
 
}
 

//process of the Element
 
public void characters(char[] chs,int start,int length)throws SAXException{
String data=new String(chs,start,length);
 
String tag=m;
convert conv=new convert(); 
if(tag.equals("author")||tag.equalsIgnoreCase("editor"))
{conv.set_name(data);
conv.set_Markierung(markierung);  
author.add(conv);}

if(tag.equals("title"))
{conv.set_name(data);
conv.set_Markierung(markierung);  
publikation.add(conv);};
 
 
if(tag.equals("book")||tag.equals("incollection"))

markierung+=1;
 
// tagsStack.pop();
}
 
public void reader(String filename){
try{
 
SAXParserFactory spf=SAXParserFactory.newInstance();
SAXParser saxParser=spf.newSAXParser();
saxParser.parse(new File(filename),this);
//XMLReader xr=XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser");
//xr.setContentHandler(new SaxTest());
// xr.parse(new InputSource(new FileReader("test.xml")));
}catch (Exception e)
  {
  e.printStackTrace();
  }

 
}
 
 
   



}


main方法 通过 一个类调用 上面类的对象。
package com.wsy;
import org.xml.sax.SAXException;
public class Start {

public static void main(String[] args)throws SAXException{
Select_sql sql=new Select_sql();
  相关解决方案