比较难 本帖最后由 sAS112UUUYY111 于 2010-03-01 17:04:22 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 另外,XML Schema中的元素是可以扩充的。 需要获取所有的element到数组中即可。 因为在网上或者书本上,根本没有出现过,用SAX方式解析Schema的例子。 为什么不用DOM解析呢?学习中...... SAX是不会有内存溢出的------------------------ 返回的是一个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(); } }} 对于大的XML文件DOM会报内存溢出的。 至今还没见过用SAX解析schema xml的解法。------------------------------------ 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); } }可以试试这个 悲剧 我只知道DOM解析~~~~SAX 不懂 关于PriorityQueue不得不说的事 MYEclipse怎么导出JAR 请问java怎么重载界面 通过正则表达式提取数据的问题 String中怎样去除最后一个字符 一个结构性问题,100分,大家都来看看 如何写出一个高效率的程序?? 16进制字符串处理 哪里有 jbuilder 和tomcat 下载 嘿,真够菜的。 麻烦大家帮忙看看 软件编程什么方向发展前景最好?
学习中......
------------------------
在对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();
}
}
}
------------------------------------
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);
}
}可以试试这个