package etax.server.frame.util;
/**
* <p>Title: BFCP</p>
* <p>Description: 多元化电子报税业务流程控制平台</p>
* <p>Copyright: Copyright (c) 2003</p>
* <p>Company:</p>
* @author gaoweibo
* @version V 2010
*/
import java.io.ByteArrayInputStream;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
public class XmlTool {
/**
*
* @param xmlStr
* 传入xml串
* @return 将xml串解析成Hashtable
* @throws Exception
* 解析失败
*/
public Hashtable LoadHashtableFromXml(String xmlStr) throws Exception {
ByteArrayInputStream Xmlbyte = null;
Hashtable xmlht = new Hashtable();
SAXBuilder builder = new SAXBuilder(false);
try {
Xmlbyte = new ByteArrayInputStream(xmlStr.getBytes("GB2312"));
Document doc = builder.build(Xmlbyte);
Element root = doc.getRootElement();
getDateFromElement(xmlht, root);
} catch (Exception e) {
e.printStackTrace();
throw new Exception("解析XML失败:" + e);
}
return xmlht;
}
/**
*
* @param xmlStr
* 传入xml串
* @return 第一层子节点。
* @throws Exception
* @注释:适用于一个xml串中包含主、附表的信息。要求以表(子节点)为逻辑单元,分别进行解析,读取数据。
*/
public Hashtable LoadHashtableFromXml(Hashtable ht, String xmlStr)
throws Exception {
ByteArrayInputStream Xmlbyte = null;
List elements = null;
SAXBuilder builder = new SAXBuilder(false);
try {
Xmlbyte = new ByteArrayInputStream(xmlStr.getBytes("GB2312"));
Document doc = builder.build(Xmlbyte);
Element root = doc.getRootElement();
return FindElement(ht, root);
} catch (Exception e) {
e.printStackTrace();
throw new Exception("解析XML失败:" + e);
}
}
public Hashtable FindElement(Hashtable ht, Element element)
throws Exception {
List elements = element.getChildren();
for (Iterator iter = elements.iterator(); iter.hasNext();) {
Element ele = (Element) iter.next();
String name = ele.getName();
if (ht.containsKey(name)) { // 找到节点,将节点内的数据作为一个逻辑整体,转换为Hashtable
Hashtable xmlht = new Hashtable();
getDateFromElement(xmlht, ele);
ht.put(name, xmlht);
} else {
if (ele.hasChildren()) {
FindElement(ht, ele);
} else {
continue;
}
}
}
return ht;
}
/**
* 从doc中提取数据
*/
public void getDateFromElement(Hashtable xmlht, Element nextEle)
throws Exception {
List list = null;
List l = null;
Element ele = null;
String name = null;
try {
if (nextEle == null) {
return;
}
list = nextEle.getChildren();
for (int i = 0; i < list.size(); i++) {
ele = (Element) list.get(i);
l = ele.getChildren();
name = ele.getName();
if (l != null && l.size() > 0) {
getDateFromElement(xmlht, ele);
} else {
String data = new String(getNodeValue(ele).getBytes("GBK"),"ISO-8859-1");
Vector v = null;
v = (Vector) xmlht.get(name);
if (v == null) {
v = new Vector();
}
v.add(data);
xmlht.put(name, v);
}
}
} catch (Exception e) {
throw e;
}
}
private String getNodeValue(Element node) {
if (node == null) {
return "";
} else if (node.getText().trim().equalsIgnoreCase("null")) {
return "";
} else {
return node.getText();
}
}
public static void main(String []args) {
String xmlStr = "<?xml version=\"1.0\" encoding=\"GB2312\"?>";
xmlStr = xmlStr + "<BFCP>";
xmlStr = xmlStr + "<ServiceName>taxKernel.SB_ZCFZBBean</ServiceName>";
xmlStr = xmlStr + "<JBXX>";
xmlStr = xmlStr + "<NSRSBH>320200835920438</NSRSBH>";
xmlStr = xmlStr + "<NSRPWD>1</NSRPWD>";
xmlStr = xmlStr + "<SSSQ_Q>20090301</SSSQ_Q>";
xmlStr = xmlStr + "<SSSQ_Z>20090331</SSSQ_Z>";
xmlStr = xmlStr + "</JBXX>";
xmlStr = xmlStr + "<ZCFZB>";
xmlStr = xmlStr + "<LN01>";
xmlStr = xmlStr + "<NCS>967624.01</NCS>";
xmlStr = xmlStr + "<QMS>299172.78</QMS>";
xmlStr = xmlStr + "</LN01>";
xmlStr = xmlStr + "<LN02>";
xmlStr = xmlStr + "<NCS>0</NCS>";
xmlStr = xmlStr + "<QMS>0</QMS>";
xmlStr = xmlStr + "</LN02>";
xmlStr = xmlStr + "<LN03>";
xmlStr = xmlStr + "<NCS>0</NCS>";
xmlStr = xmlStr + "<QMS>0</QMS>";
xmlStr = xmlStr + "</LN03>";
xmlStr = xmlStr + "</ZCFZB>";
xmlStr = xmlStr + "</BFCP>";
Hashtable ht = new Hashtable();
ht.put("JBXX", "");
ht.put("ZCFZB", "");
XmlTool tool = new XmlTool();
try{
tool.LoadHashtableFromXml(ht, xmlStr);
System.out.println(ht.get("JBXX"));
System.out.println(ht.get("ZCFZB"));
}catch(Exception e){
System.out.println(e.getMessage());
}
}
}