本帖最后由 sAS112UUUYY111 于 2010-03-01 17:04:22 编辑

解决方案 »

  1.   

    另外,XML Schema中的元素是可以扩充的。
      

  2.   

    需要获取所有的element到数组中即可。
      

  3.   

    因为在网上或者书本上,根本没有出现过,用SAX方式解析Schema的例子。
      

  4.   

    为什么不用DOM解析呢?
    学习中......
      

  5.   

    SAX是不会有内存溢出的
    ------------------------
      

  6.   

    返回的是一个List<Bean>,Bean的内部还有一个childBean的List,
    在对element节点的读取上目前只考虑了2层,如果要扩展,就重写一下start,endElement方法吧
    import java.io.File;
    import java.util.*;
    import javax.xml.parsers.*;
    import org.xml.sax.Attributes;
    import org.xml.sax.helpers.DefaultHandler;public class Q {
    public Q() { 
    } public List readXML(String FileName) throws Exception{
    SAXParserFactory spf = SAXParserFactory.newInstance();
    SAXParser sp = spf.newSAXParser();

    MySAXHandler handler = new MySAXHandler();
    sp.parse(new File(FileName), handler);
    return handler.getResult();
    }class MySAXHandler extends DefaultHandler{
    java.util.Stack tagStack = new java.util.Stack();
    List beans = new ArrayList();
    Bean bean = null;
    boolean complex = false;
    @SuppressWarnings("unchecked")
    public void startElement(String namespace,String localName,String qName,Attributes atts){
    tagStack.push(qName);
    if(bean!=null){
    if(qName.equals("xs:complexType")){
    complex = true;
    }
    }
    if(qName.equals("xs:element")){
    if(bean==null){
    bean = new Bean();
    bean.name = atts.getValue("name");
    }
    else{
    Bean child = new Bean();
    child.name = atts.getValue("name");
    bean.childBean.add(child);
    }
    }
    }

    public void endElement(String namespace,String localName,String qName){
    if(qName.equals("xs:complexType")){
    complex = false;
    }
    if(qName.equals("xs:element")){
    if(complex){
    System.out.println("complex element end");
    }
    else{
    System.out.println("simple element end");
    beans.add(bean);
    bean = null;
    complex = false;
    }
    }
    }

    public void characters(char[] chs,int start,int length){
    String tag = (String)tagStack.peek();
    String value = new String(chs,start,length);
    }

    public List getResult(){
    System.out.println(beans.size());
    System.out.println(((Bean)(beans.get(0))).childBean.size());
    return beans;
    }
    }public class Bean{
    String name;
    List childBean = new ArrayList();
    }public static void main(String[] args){
    String name = "a.xml";
    Q q = new Q();
    try {
    q.readXML(name);
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }
      

  7.   

    对于大的XML文件DOM会报内存溢出的。
      

  8.   

    至今还没见过用SAX解析schema xml的解法。
    ------------------------------------
      

  9.   


    List element=q.readXML(name);
            for(Object a:element){
             System.out.println("Bean.name:"+((Bean)a).name);
             for(Object b:((Bean)a).childBean){
             System.out.println("childBean.name:"+((Bean)b).name);
             }
            }可以试试这个
      

  10.   

    悲剧 我只知道DOM解析~~~~SAX 不懂