package pushMessage.server.util;
import java.io.StringReader;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xml.sax.InputSource;
import xframe.codec.Base64;
import xframe.codec.Des;
import xframe.util.LogUtils;
public class XmlUtils {
private final static Logger log=LoggerFactory.getLogger(XmlUtils.class);
/**
* 将xml格式的字符串解析成map(针对子节点中没有重复的节点名)
* @param xmlDoc
* @return
* @throws Exception
*/
public static Map parse(String xmlDoc) throws Exception
{
StringReader xmlString = new StringReader(xmlDoc);
// 创建新的输入源SAX 解析器将使用 InputSource 对象来确定如何读取 XML 输入
InputSource source = new InputSource(xmlString);
// 创建一个新的SAXBuilder
SAXBuilder saxb = new SAXBuilder();
// 通过输入源构造一个Document
Document doc = saxb.build(source);
Element root = doc.getRootElement();
// 得到根元素所有子元素的集合
List node = root.getChildren();
Map m=new HashMap();
if(node.size()>0)
{
for(int i=0;i<node.size();i++)
{
Element el=(Element)node.get(i);
m.put(el.getName(), el.getText());
}
}
else
{
m.put(root.getName(), root.getText());
}
return m;
}
/**
* 将xml字符串解析成list(针对子节点重复的xml)
* @param xmlDoc
* @return
* @throws Exception
*/
public static List parseXml(String xmlDoc) throws Exception
{
StringReader xmlString = new StringReader(xmlDoc);
// 创建新的输入源SAX 解析器将使用 InputSource 对象来确定如何读取 XML 输入
InputSource source = new InputSource(xmlString);
// 创建一个新的SAXBuilder
SAXBuilder saxb = new SAXBuilder();
// 通过输入源构造一个Document
Document doc = saxb.build(source);
Element root = doc.getRootElement();
List a=root.getChildren();
List result=new ArrayList();
Element el=null;
for(int i=0;i<a.size();i++){
el=(Element) a.get(i);
result.add(el.getText());
}
return result;
}
/**
* map转换成String方式的XML
* @param xmlMap
* @return
* @throws Exception
*/
public static String parseString(Map xmlMap)throws Exception{
StringBuffer sb=new StringBuffer();
sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>");
sb.append("<realname>");
if(xmlMap.containsKey(ConstantsUtil.XML_ELEMENT_PUSHTYPE)){
sb.append("<action>");
sb.append(xmlMap.get("action")==null?"":xmlMap.get("action"));//验证方式
sb.append("</action>");
}
sb.append("</realname>");
return sb.toString();
}
/**
* list转xml格式的String
* @param xmlList 消息列表
* @param netbarCode 网吧编码
* @param cardCode 身份证号
* @param mac mac地址
* @param key 用户信息加密key
* @param transpondUrl 消息跳转url
* @return
* @throws Exception
*/
public static String parseString(List<Map> xmlList,String netbarCode,String cardCode,String mac,String key,String transpondUrl) throws Exception{
StringBuffer sb=new StringBuffer();
try {
sb.append("<?xml version=\"1.0\" encoding=\"GB2312\"?>");
sb.append("<root>");
if(xmlList.size()>0){
for(Map xmlMap:xmlList){
sb.append("<ad>");
if(xmlMap.containsKey(ConstantsUtil.XML_ELEMENT_PUSHTYPE)){
sb.append("<pushtype>");
sb.append(xmlMap.get(ConstantsUtil.XML_ELEMENT_PUSHTYPE)==null?"":xmlMap.get(ConstantsUtil.XML_ELEMENT_PUSHTYPE));
sb.append("</pushtype>");
}
if(xmlMap.containsKey(ConstantsUtil.XML_ELEMENT_TITLE)){
sb.append("<title>");
sb.append(xmlMap.get(ConstantsUtil.XML_ELEMENT_TITLE)==null?"":xmlMap.get(ConstantsUtil.XML_ELEMENT_TITLE));
sb.append("</title>");
}
if(xmlMap.containsKey(ConstantsUtil.XML_ELEMENT_CONTENT)){
sb.append("<content>");
sb.append(xmlMap.get(ConstantsUtil.XML_ELEMENT_CONTENT)==null?"":xmlMap.get(ConstantsUtil.XML_ELEMENT_CONTENT));
sb.append("</content>");
}
if(xmlMap.containsKey(ConstantsUtil.XML_ELEMENT_URL)){
sb.append("<url>");
//实际跳转url
String url=transpondUrl+"?messageId="+xmlMap.get("c_serial_id")+"&message="+URLEncoder.encode(Base64.encode(Des.encode((netbarCode+"|"
+cardCode+"|"+mac).getBytes(), key)),"UTF-8")+"&backUrl=";
sb.append(xmlMap.get(ConstantsUtil.XML_ELEMENT_URL)==null?"":url+xmlMap.get(ConstantsUtil.XML_ELEMENT_URL));
sb.append("</url>");
}
if(xmlMap.containsKey(ConstantsUtil.XML_ELEMENT_DELAYTIME)){
sb.append("<delaytime>");
sb.append(xmlMap.get(ConstantsUtil.XML_ELEMENT_DELAYTIME)==null?"":xmlMap.get(ConstantsUtil.XML_ELEMENT_DELAYTIME));
sb.append("</delaytime>");
}
if(xmlMap.containsKey(ConstantsUtil.XML_ELEMENT_CONTROLTYPE)){
sb.append("<controltype>");
sb.append(xmlMap.get(ConstantsUtil.XML_ELEMENT_CONTROLTYPE)==null?"":xmlMap.get(ConstantsUtil.XML_ELEMENT_CONTROLTYPE));
sb.append("</controltype>");
}
if(xmlMap.containsKey(ConstantsUtil.XML_ELEMENT_CONTROLTIME)){
sb.append("<controltime>");
sb.append(xmlMap.get(ConstantsUtil.XML_ELEMENT_CONTROLTIME)==null?"":xmlMap.get(ConstantsUtil.XML_ELEMENT_CONTROLTIME));
sb.append("</controltime>");
}
if(xmlMap.containsKey(ConstantsUtil.XML_ELEMENT_WIDTH)){
sb.append("<width>");
sb.append(xmlMap.get(ConstantsUtil.XML_ELEMENT_WIDTH)==null?"":xmlMap.get(ConstantsUtil.XML_ELEMENT_WIDTH));
sb.append("</width>");
}
if(xmlMap.containsKey(ConstantsUtil.XML_ELEMENT_HEIGHT)){
sb.append("<height>");
sb.append(xmlMap.get(ConstantsUtil.XML_ELEMENT_HEIGHT)==null?"":xmlMap.get(ConstantsUtil.XML_ELEMENT_HEIGHT));
sb.append("</height>");
}
sb.append("</ad>");
}
}
else
sb.append("<ad></ad>");
sb.append("</root>");
log.debug(sb.toString());
return sb.toString();
} catch (Exception e) {
log.error(LogUtils.getExceptionTrace(e));
return null;
}
}
public static void main(String[] args) throws Exception {
// String xml="<?xml version='1.0' encoding='utf-8'?>" +
// "<ArrayOfString xmlns='http:\\tempuri.org/'>" +
// "<string>2011-02-22,15:31:14,13488708904,1065712038002907,*,11233321</string>" +
// "<string>2011-02-22,15:31:14,13488708904,1065712038002907,*,555555566982</string>" +
// "</ArrayOfString>";
String xml="<?xml version='1.0' encoding='utf-8'?>" +
"<ArrayOfString xmlns='http:\\tempuri.org/'/>" ;
// Map m=XmlUtils.parse(xml);
// XmlUtils.parseXml(xml);
// System.out.println(m.toString());
String a="<?xml version='1.0' encoding='windows-1252'?>"+
"<realname><action>1</action><validate/><username>5ZSQ5bu65a6d</username><cardnumber>420704198012164298</cardnumber><cardkind>0</cardkind><photo/><mobile>13693168925</mobile><securitycode/><fingerid/><fingerjpg/></realname>";
Map m=XmlUtils.parse(a);
System.out.println(m.toString());
}
}