用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
<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
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();
}
}
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);
}
}
}
至于如果是N层,也很简单,把程序改改,改成递归的就可以啦,不过dom擅长的方式不是遍历,而是查找具体的某一个节点,它可以根据节点的名称马上找那个节点
支持DTD校验,GB2312编码.前几年写的,用到不少项目中,现在打算
开源,让这个东西能继续发展下去(目前提供免费技术支持):下载地址在此:
http://resource.netsoftlab.ca/topic.php?a=disp&id=8
-----------------------
什么年代了还考SAX?SAX是推模型,非常不灵活,也很麻烦...有空看看拉模型、XPath吧...
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));
}}