用SAX解析下列XML:<?xml version="1.0"?>
<in>
  <sheader>
    <mac></mac>
    <MACInstNo>9850</MACInstNo>
    <PINSeed></PINSeed>
    <SrcChnlNo>850</SrcChnlNo>
    <ChkFlag></ChkFlag>
    <CombFlag></CombFlag>
    <HostServ>waiwei_02</HostServ>
  </sheader>
  <tpheader>
    <TermId></TermId>
    <InstNo>3500</InstNo>
    <TlrNo>901004</TlrNo>
  </tpheader>
  <tdheader>
    <TranCode>7703</TranCode>
    <TermJourNo>000850326665</TermJourNo>
    <TermDate>20070706</TermDate>
    <AuthTlrNo></AuthTlrNo>
    <AuthPIN></AuthPIN>
    <AuthCardFlag></AuthCardFlag>
    <AuthCardSeq></AuthCardSeq>
  </tdheader>
  <tin>
    <Type>1</Type>
    <mobileNum>123456</mobileNum>
    <Mode>1</Mode> 
  </tin>
</in>
    解析结果为一个Map,key是xml中元素的全路径,value是元素的值,例如:
in.sheader.MACInstNo = 9850

解决方案 »

  1.   

    参看文档才行,SAX的东东记不住,DOM还差不多
      

  2.   

    sax是什么东西我都不知道   努力学习。
      

  3.   

    dom4j很容易就解析出来了
      

  4.   

    import java.io.File;
    import java.io.IOException;
    import java.util.Map;
    import java.util.TreeMap;import javax.xml.parsers.ParserConfigurationException;
    import javax.xml.parsers.SAXParser;
    import javax.xml.parsers.SAXParserFactory;import org.xml.sax.Attributes;
    import org.xml.sax.SAXException;
    import org.xml.sax.helpers.DefaultHandler;public class SAXTest extends DefaultHandler{  private static Map<String, String> map = new TreeMap<String, String>();
      private String curKey = "";
      private String key = "";
      private String value = "";  public static void main(String[] args) throws ParserConfigurationException,
          SAXException, IOException {
        SAXParserFactory factory = SAXParserFactory.newInstance();
        SAXParser parser = factory.newSAXParser();
        parser.parse(new File("a.xml"), new SAXTest());
        
        // 输出 map
        for(Map.Entry<String, String> entry : map.entrySet()) {
          System.out.println(entry.getKey() + " --> " + entry.getValue());
        }
      }  public void startElement(String namespaceURI, String localName,
          String qName, Attributes attributes) throws SAXException {
        if (key.length() == 0) {
          key = qName;
        } else {
          key = key + "." + qName;
        }
        curKey = qName;
      }  public void endElement(String uri, String localName, String qName)
          throws SAXException {
        if (key.contains(".")) {
          if (curKey.equals(qName)) {
            map.put(key, value);
          }
          key = key.substring(0, key.lastIndexOf(qName) - 1);
        }
      }  public void characters(char[] ch, int start, int length) {
        value = new String(ch, start, length).trim();
      }
    }
      

  5.   

    楼上startElement和endElement写得很精彩,不过感觉还是dom解析得容易呀,以前基本上都用的dom或者sax2dom,基本很少单独用sax的
      

  6.   

    但是题目要求使用 SAX 的啊!我不大会用 DOM,我发觉 DOM 的子节点什么的麻烦死了,可能我用得不对吧,以后努力学习使用 DOM,呵呵。
      

  7.   

    dom解析方式:import java.util.Iterator;
    import java.util.HashMap;
    import java.util.Set;
    import java.io.File;
    import org.dom4j.Document;
    import org.dom4j.Element;
    import org.dom4j.io.SAXReader;public class DOM4jParser {  public DOM4jParser() {
      }
      public static HashMap parse(String fileName) throws Exception {
        HashMap result = new HashMap();
        SAXReader reader = new SAXReader();
        File file = new File(fileName);
        Document doc = reader.read(file);
        Element root = doc.getRootElement();
        Iterator it = root.elementIterator();
        while(it.hasNext()) {
          Element element = (Element)it.next();
          Iterator ita = element.elementIterator();
          while(ita.hasNext()) {
            Element elementa = (Element)ita.next();
            result.put(
                root.getName()+"."+element.getName()+"."+elementa.getName(), elementa.getText());
          }
         }
         return result;
       }   
       
       public static void main(String args[]) throws Exception {
         HashMap hm = DOM4jParser.parse("D:/temp.xml");
         Set set = hm.keySet();
         for(Iterator it = set.iterator();it.hasNext();){
           String key = (String)it.next();
           String value = (String)hm.get(key);
           System.out.println(key+"="+value);
         }
       }
    }
      

  8.   

    dom4j,要知道这是面试的机试题,应该只能使用 Java 内置的工具,不允许你使用其他的解析工具的吧。
      

  9.   

    to: sureyor现在是知道数据的深度是固定的三层,万一它不是三层是四层,或者说既有三层也有四层呢?
      

  10.   

    我只是举一个简单的例子,说明dom操作方式的不同,至于是否用到了内至的工具,我觉得就无所谓了吧
    至于如果是N层,也很简单,把程序改改,改成递归的就可以啦,不过dom擅长的方式不是遍历,而是查找具体的某一个节点,它可以根据节点的名称马上找那个节点
      

  11.   

    楼上说的有道理。顺道共享我写的一套SDK程序:NSL-Domtree (an OpenSource DOM/SAX XML API)一套DOM/SAX XML函数库(C语言写的).在Expat基础上进行的封装.
    支持DTD校验,GB2312编码.前几年写的,用到不少项目中,现在打算
    开源,让这个东西能继续发展下去(目前提供免费技术支持):下载地址在此:
    http://resource.netsoftlab.ca/topic.php?a=disp&id=8
      

  12.   

    知道思路就行了,知道dom和sax的区别就完事了,让人记住这些有点过了
      

  13.   

    为什么那么多人对 DOM 情有独钟,像这个题目,用 SAX 也挺方便。看来我也要去努力学学各种 DOM 的解析了。
      

  14.   

    使用这种考题足以说明大唐电信是不能去的~~
    -----------------------
    什么年代了还考SAX?SAX是推模型,非常不灵活,也很麻烦...有空看看拉模型、XPath吧...
      

  15.   

    sax 有几个事件,好久没用了 要温故下才行哦.
      

  16.   

    package com.cattsoft.ReadXml;import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.Reader;
    import java.util.HashMap;
    import java.util.Map;
    import java.util.Properties;import org.apache.log4j.Logger;
    import org.jdom.Document;
    import org.jdom.Element;
    import org.jdom.JDOMException;
    import org.jdom.input.SAXBuilder;import com.cattsoft.utility.log.LoggerFactory;public class ReadXml {
     Logger logger= LoggerFactory.getLogger(ReadXml.class.getName());
    private static String key;

    public static String getKey() {
    return key;
    }
    public static void setKey(String key) {
    ReadXml.key = key;
    }
    public Map getMap(){

    Map map=new HashMap();
    Reader reader;
    File file;
    Properties prop=System.getProperties();
    String path=prop.getProperty("user.dir");
    String fileName="Config.xml";
    file =new File(path,fileName);
    try{
    reader=new InputStreamReader(new FileInputStream(file),"GB2312");
    SAXBuilder builder=new SAXBuilder();
    Document doc =builder.build(reader);
    Element element=doc.getRootElement();
    Element sheader=element.getChild("sheader");

    map.put(element.getName()+"."+sheader.getName()+"."+sheader.getChild("MACInstNo").getName(), sheader.getChildTextTrim("MACInstNo"));
    logger.info(element.getName()+"."+sheader.getName()+"."+sheader.getChild("MACInstNo").getName());
    key =element.getName()+"."+sheader.getName()+"."+sheader.getChild("MACInstNo").getName();
    }catch(IOException ie){
    logger.error("IOException",ie);
    }
    catch(JDOMException je){
    logger.error("jdom exception :",je);

    }

    return map;
    }
    public static void main(String[] args) {
    ReadXml rx=new ReadXml();
    Map mp=rx.getMap();
    System.out.println(key+"="+mp.get(key));

    }}