能帮忙看看嘛?入参是以XML格式的字符串。需要解析这个XML,重要的是 exp逻辑关系如何与条件具体项目(RXXSD、CSRQ、XP) 组合成 where 本帖最后由 lgmsyy 于 2014-08-13 11:38:57 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 package shi;import java.io.File;import java.net.MalformedURLException;import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.Element;import org.dom4j.io.SAXReader;/** * * * 业务逻辑是: 对方传入的入参是以XML格式的字符串。我需要解析这个XML,但其中重要的是 exp逻辑关系如何与条件具体项目(RXXSD、CSRQ、XP) * 组合成 where 条件语句呢? * * 并且exp的逻辑关系不仅仅限与这个例子 exp="1*(2+3)*4" * * 其中 exp是逻辑关系:*代表与 +代表或 ()代表优先级 * * 1代表第一个条件具体项目RXXSD 2代表第二个条件具体项目CSRQ 3代表第三个条件具体项目CSRQ 4代表第四个条件具体项目XP * * * 举例说明,我们接受对方的入参XML格式字符串 <?xml version="1.0" encoding="UTF-8"?> <CONDITIONS> * <CONDITION exp="1*(2+3)*4"> <RXXSD operation="=">71</RXXSD> <CSRQ * operation=">=">19600101</CSRQ> <CSRQ operation="<=">19900101</CSRQ> * <XP>tom</XP> </CONDITION> </CONDITIONS> * * 如何通过exp="1*(2+3)*4"逻辑关系与具体条件项目组合,最终要拼成SQL语句 * * select * from table where RXXSD=71 and (CSRQ>=1960 or CSRQ<=1990) and * XP='tom'; * * @author Administrator * */public class Test20 { public static void main(String args[]) throws DocumentException, MalformedURLException { List<Map<String, Object>> list = readXml("F:\\data.xml"); List<String> retList = createSqlStr(list); System.out.println(retList); } public static List<String> createSqlStr(List<Map<String, Object>> list){ List<String> retList = new ArrayList<String>(); for(int i=0;i<list.size();i++){ Map<String,Object> map = list.get(i); String exp=(String)map.get("exp"); exp = exp.replaceAll("\\*", " and ").replaceAll("\\+", " or "); List<Map<String,String>> condition = (List<Map<String,String>>)map.get("condition"); for(int j=0;j<condition.size();j++){ Map<String,String> condMap = condition.get(j); String name = condMap.get("name"); String text = condMap.get("text"); String operation = condMap.get("operation"); exp=exp.replaceAll((j+1)+"", " "+name+operation+text+" "); } retList.add(exp); } return retList; } public static List<Map<String, Object>> readXml(String path) { //考虑可能有多个condition List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); try { SAXReader reader = new SAXReader(); Document doc = reader.read(new File(path)); Element rootElm = doc.getRootElement(); List<String> nodes = rootElm.elements("CONDITION"); for (Iterator it = nodes.iterator(); it.hasNext();) { Map<String, Object> map = new HashMap<String, Object>(); Element elm = (Element) it.next(); String exp = elm.attributeValue("exp"); map.put("exp", exp); List projects = doc.selectNodes("CONDITIONS/CONDITION/*"); Iterator it1 = projects.iterator(); List<Map<String,String>> conList = new ArrayList<Map<String,String>>(); while (it1.hasNext()) { Map<String,String> conMap = new HashMap<String,String>(); Element elm1 = (Element) it1.next(); String elmname = elm1.getName(); String value = elm1.getStringValue(); String operation = elm1.attributeValue("operation"); System.out.println("elmname=" + elmname + ",operation=" + operation + ",value=" + value); conMap.put("name", elmname); conMap.put("operation", operation==null?"=":operation); conMap.put("text", value); conList.add(conMap); } map.put("condition", conList); list.add(map); } } catch (Exception ex) { ex.printStackTrace(); } return list; }} 但是我稍微变更下条件,按照上面的就得不出先要的结果了啊<?xml version="1.0" encoding="UTF-8"?><CONDITIONS> <CONDITION no="1" sid="000104" exp="1*(2+3)*4"> <RXXSD operation="=">80</RXXSD> <FHJGJLS operation="=">5</FHJGJLS> <SJGSDW operation="=">001</SJGSDW> <GMSFHM operation="=">XXX</GMSFHM> <XP>base64</XP> </CONDITION></CONDITIONS> 但是我稍微变更下条件,按照上面的就得不出先要的结果了啊<?xml version="1.0" encoding="UTF-8"?><CONDITIONS> <CONDITION no="1" sid="000104" exp="1*(2+3)*4"> <RXXSD operation="=">80</RXXSD> <FHJGJLS operation="=">5</FHJGJLS> <SJGSDW operation="=">001</SJGSDW> <GMSFHM operation="=">XXX</GMSFHM> <XP>base64</XP> </CONDITION></CONDITIONS>根据exp表达式来匹配的,这个xml条件1234四个,但是底面确是5个(RXXSD ,FHJGJLS ,SJGSDW ,GMSFHM ,XP ) 但是我稍微变更下条件,按照上面的就得不出先要的结果了啊<?xml version="1.0" encoding="UTF-8"?><CONDITIONS> <CONDITION no="1" sid="000104" exp="1*(2+3)*4"> <RXXSD operation="=">80</RXXSD> <FHJGJLS operation="=">5</FHJGJLS> <SJGSDW operation="=">001</SJGSDW> <GMSFHM operation="=">XXX</GMSFHM> <XP>base64</XP> </CONDITION></CONDITIONS>根据exp表达式来匹配的,这个xml条件1234四个,但是底面确是5个(RXXSD ,FHJGJLS ,SJGSDW ,GMSFHM ,XP )是的,最后一个是图片格式的BASE64字符。这个是需要的,但没有opertion 但是我稍微变更下条件,按照上面的就得不出先要的结果了啊<?xml version="1.0" encoding="UTF-8"?><CONDITIONS> <CONDITION no="1" sid="000104" exp="1*(2+3)*4"> <RXXSD operation="=">80</RXXSD> <FHJGJLS operation="=">5</FHJGJLS> <SJGSDW operation="=">001</SJGSDW> <GMSFHM operation="=">XXX</GMSFHM> <XP>base64</XP> </CONDITION></CONDITIONS>根据exp表达式来匹配的,这个xml条件1234四个,但是底面确是5个(RXXSD ,FHJGJLS ,SJGSDW ,GMSFHM ,XP )是的,最后一个是图片格式的BASE64字符。这个是需要的,但没有opertion那是只需要有operrtion属性的节点吗?他们的顺序还有规定啊? 如果需要是有opertion的节点,顺序就是xml文件中各个节点的顺序,代码重新调整下package shi;import java.io.File;import java.net.MalformedURLException;import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.Element;import org.dom4j.io.SAXReader;/** * * * 业务逻辑是: 对方传入的入参是以XML格式的字符串。我需要解析这个XML,但其中重要的是 exp逻辑关系如何与条件具体项目(RXXSD、CSRQ、XP) * 组合成 where 条件语句呢? * * 并且exp的逻辑关系不仅仅限与这个例子 exp="1*(2+3)*4" * * 其中 exp是逻辑关系:*代表与 +代表或 ()代表优先级 * * 1代表第一个条件具体项目RXXSD 2代表第二个条件具体项目CSRQ 3代表第三个条件具体项目CSRQ 4代表第四个条件具体项目XP * * * 举例说明,我们接受对方的入参XML格式字符串 <?xml version="1.0" encoding="UTF-8"?> <CONDITIONS> * <CONDITION exp="1*(2+3)*4"> <RXXSD operation="=">71</RXXSD> <CSRQ * operation=">=">19600101</CSRQ> <CSRQ operation="<=">19900101</CSRQ> * <XP>tom</XP> </CONDITION> </CONDITIONS> * * 如何通过exp="1*(2+3)*4"逻辑关系与具体条件项目组合,最终要拼成SQL语句 * * select * from table where RXXSD=71 and (CSRQ>=1960 or CSRQ<=1990) and * XP='tom'; * * @author Administrator * */public class Test20 { public static void main(String args[]) throws DocumentException, MalformedURLException { //List<Map<String, Object>> list = readXml("F:\\data.xml"); //List<String> retList = createSqlStr(list); //System.out.println(retList); List<Map<String, Object>> list2 = readXml("F:\\data2.xml"); List<String> retList2 = createSqlStr(list2); System.out.println(retList2); } public static List<String> createSqlStr(List<Map<String, Object>> list){ List<String> retList = new ArrayList<String>(); for(int i=0;i<list.size();i++){ Map<String,Object> map = list.get(i); String exp=(String)map.get("exp"); //TODO 该方法可能需要拓展或者重构 exp = converExp(exp,10); //System.out.println(exp); List<Map<String,String>> condition = (List<Map<String,String>>)map.get("condition"); for(int j=0;j<condition.size();j++){ Map<String,String> condMap = condition.get(j); String name = condMap.get("name"); String text = condMap.get("text"); String operation = condMap.get("operation"); exp=exp.replaceAll("#"+(j+1)+"#", " "+name+operation+text+" "); } retList.add(exp); } return retList; } /** * 把原来的exp表达式中的1、2、3、……替换为#1#、#2#……<br> * 防止某些节点的内容为1或者2这些<br> * 当然你也可以替换为其他的比如$1$、$2$……<br> * @param exp * @param n 替换的个数(从1-10)目前是10个,当然也有可能更多<br> * @return */ private static String converExp(String exp,int n){ for(int i=1;i<=n;i++){ exp=exp.replaceAll(""+i, "\\#"+i+"\\#"); } exp = exp.replaceAll("\\*", " and ").replaceAll("\\+", " or "); return exp; } public static List<Map<String, Object>> readXml(String path) { //考虑可能有多个condition List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); try { SAXReader reader = new SAXReader(); Document doc = reader.read(new File(path)); Element rootElm = doc.getRootElement(); List<String> nodes = rootElm.elements("CONDITION"); for (Iterator it = nodes.iterator(); it.hasNext();) { Map<String, Object> map = new HashMap<String, Object>(); Element elm = (Element) it.next(); String exp = elm.attributeValue("exp"); map.put("exp", exp); List projects = doc.selectNodes("CONDITIONS/CONDITION/*"); Iterator it1 = projects.iterator(); List<Map<String,String>> conList = new ArrayList<Map<String,String>>(); while (it1.hasNext()) { Map<String,String> conMap = new HashMap<String,String>(); Element elm1 = (Element) it1.next(); String elmname = elm1.getName(); String value = elm1.getStringValue(); String operation = elm1.attributeValue("operation"); System.out.println("elmname=" + elmname + ",operation=" + operation + ",value=" + value); conMap.put("name", elmname); conMap.put("operation", operation==null?"=":operation); conMap.put("text", value); if(operation!=null){ conList.add(conMap); } } map.put("condition", conList); list.add(map); } } catch (Exception ex) { ex.printStackTrace(); } return list; }} <?xml version="1.0" encoding="UTF-8"?><CONDITIONS> <CONDITION no="1" sid="000104" exp="1*2*3*4*5*6"> <RXXSD operation="=">80</RXXSD> <FHJGJLS operation="=">5</FHJGJLS> <SJGSDW operation="=">001</SJGSDW> <GMSFHM operation="=">210106198701273019</GMSFHM> <XM operation="=">留个名</XM> <XBDM operation="=">1</XBDM> </CONDITION></CONDITIONS>你好,有个严重的问题。条件选项6个,当替换 5的时候呀,因为是 FHJGJLS =5 ,当进行replace的时候,会发生错误! 这个错误已经更正,上面的代码就是但是遇到10 , 它会将10 中的 1,当做1替换了啊。package shi;import java.io.File;import java.net.MalformedURLException;import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.regex.Matcher;import java.util.regex.Pattern;import org.apache.commons.lang.StringUtils;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.Element;import org.dom4j.io.SAXReader;/** * * * 业务逻辑是: 对方传入的入参是以XML格式的字符串。我需要解析这个XML,但其中重要的是 exp逻辑关系如何与条件具体项目(RXXSD、CSRQ、XP) * 组合成 where 条件语句呢? * * 并且exp的逻辑关系不仅仅限与这个例子 exp="1*(2+3)*4" * * 其中 exp是逻辑关系:*代表与 +代表或 ()代表优先级 * * 1代表第一个条件具体项目RXXSD 2代表第二个条件具体项目CSRQ 3代表第三个条件具体项目CSRQ 4代表第四个条件具体项目XP * * * 举例说明,我们接受对方的入参XML格式字符串 <?xml version="1.0" encoding="UTF-8"?> <CONDITIONS> * <CONDITION exp="1*(2+3)*4"> <RXXSD operation="=">71</RXXSD> <CSRQ * operation=">=">19600101</CSRQ> <CSRQ operation="<=">19900101</CSRQ> * <XP>tom</XP> </CONDITION> </CONDITIONS> * * 如何通过exp="1*(2+3)*4"逻辑关系与具体条件项目组合,最终要拼成SQL语句 * * select * from table where RXXSD=71 and (CSRQ>=1960 or CSRQ<=1990) and * XP='tom'; * * @author Administrator * */public class Test20 { public static void main(String args[]) throws DocumentException, MalformedURLException { /* * List<Map<String, Object>> list = readXml("F:\\data.xml"); * * List<String> retList = createSqlStr(list); * System.out.println(retList); */ List<Map<String, Object>> list2 = readXml("F:\\data2.xml"); List<String> retList2 = createSqlStr(list2); System.out.println(retList2); } public static List<String> createSqlStr(List<Map<String, Object>> list) { List<String> retList = new ArrayList<String>(); for (int i = 0; i < list.size(); i++) { Map<String, Object> map = list.get(i); String exp = (String) map.get("exp"); // TODO 该方法可能需要拓展或者重构 exp = converExp(exp); // System.out.println(exp); List<Map<String, String>> condition = (List<Map<String, String>>) map .get("condition"); for (int j = 0; j < condition.size(); j++) { Map<String, String> condMap = condition.get(j); String name = condMap.get("name"); String text = condMap.get("text"); String operation = condMap.get("operation"); exp = exp.replaceAll("#" + (j + 1) + "#", " " + name + operation + text + " "); } retList.add(exp); } return retList; } /** * 把原来的exp表达式中的1、2、3、……替换为#1#、#2#……<br> * 防止某些节点的内容为1或者2这些<br> * 当然你也可以替换为其他的比如$1$、$2$……<br> * * @param exp * @param n * 替换的个数(从1-10)目前是10个,当然也有可能更多<br> * @return */ private static String converExp(String exp) { String regex = "(\\d+)"; exp = exp.replaceAll(regex,"#$1#"); exp = exp.replaceAll("\\*", " and ").replaceAll("\\+", " or "); return exp; } public static List<Map<String, Object>> readXml(String path) { // 考虑可能有多个condition List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); try { SAXReader reader = new SAXReader(); Document doc = reader.read(new File(path)); Element rootElm = doc.getRootElement(); List<String> nodes = rootElm.elements("CONDITION"); for (Iterator it = nodes.iterator(); it.hasNext();) { Map<String, Object> map = new HashMap<String, Object>(); Element elm = (Element) it.next(); String exp = elm.attributeValue("exp"); map.put("exp", exp); List projects = doc.selectNodes("CONDITIONS/CONDITION/*"); Iterator it1 = projects.iterator(); List<Map<String, String>> conList = new ArrayList<Map<String, String>>(); while (it1.hasNext()) { Map<String, String> conMap = new HashMap<String, String>(); Element elm1 = (Element) it1.next(); String elmname = elm1.getName(); String value = elm1.getStringValue(); String operation = elm1.attributeValue("operation"); System.out.println("elmname=" + elmname + ",operation=" + operation + ",value=" + value); conMap.put("name", elmname); conMap.put("operation", operation == null ? "=" : operation); conMap.put("text", value); if (operation != null) { conList.add(conMap); } } map.put("condition", conList); list.add(map); } } catch (Exception ex) { ex.printStackTrace(); } return list; }} 达人帮忙分析一下注册qq号时提交post头信息的cookie key=uoc值获取 请教个基础问题 ???这是什么错误???(附源码) 连数据库的问题没有解决,但是测试出了些结果,麻烦大家再来看看 问一下java连接数据库的问题 synchronized method的机锁是什么? 正在学java,想做点实际的东西,可是不知道做什么? 请问,如何在Java按钮上使用圆滑的中文字体? jetcar一类下载工具的断点续传功能怎么做? tomcat占用80端口出错误信息 java没有指针怎样实现树的数据结构? 如何在字符串中将有意义的数字提取出来
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;/**
*
*
* 业务逻辑是: 对方传入的入参是以XML格式的字符串。我需要解析这个XML,但其中重要的是 exp逻辑关系如何与条件具体项目(RXXSD、CSRQ、XP)
* 组合成 where 条件语句呢?
*
* 并且exp的逻辑关系不仅仅限与这个例子 exp="1*(2+3)*4"
*
* 其中 exp是逻辑关系:*代表与 +代表或 ()代表优先级
*
* 1代表第一个条件具体项目RXXSD 2代表第二个条件具体项目CSRQ 3代表第三个条件具体项目CSRQ 4代表第四个条件具体项目XP
*
*
* 举例说明,我们接受对方的入参XML格式字符串 <?xml version="1.0" encoding="UTF-8"?> <CONDITIONS>
* <CONDITION exp="1*(2+3)*4"> <RXXSD operation="=">71</RXXSD> <CSRQ
* operation=">=">19600101</CSRQ> <CSRQ operation="<=">19900101</CSRQ>
* <XP>tom</XP> </CONDITION> </CONDITIONS>
*
* 如何通过exp="1*(2+3)*4"逻辑关系与具体条件项目组合,最终要拼成SQL语句
*
* select * from table where RXXSD=71 and (CSRQ>=1960 or CSRQ<=1990) and
* XP='tom';
*
* @author Administrator
*
*/
public class Test20 { public static void main(String args[]) throws DocumentException,
MalformedURLException {
List<Map<String, Object>> list = readXml("F:\\data.xml");
List<String> retList = createSqlStr(list);
System.out.println(retList);
}
public static List<String> createSqlStr(List<Map<String, Object>> list){
List<String> retList = new ArrayList<String>();
for(int i=0;i<list.size();i++){
Map<String,Object> map = list.get(i);
String exp=(String)map.get("exp");
exp = exp.replaceAll("\\*", " and ").replaceAll("\\+", " or ");
List<Map<String,String>> condition = (List<Map<String,String>>)map.get("condition");
for(int j=0;j<condition.size();j++){
Map<String,String> condMap = condition.get(j);
String name = condMap.get("name");
String text = condMap.get("text");
String operation = condMap.get("operation");
exp=exp.replaceAll((j+1)+"", " "+name+operation+text+" ");
}
retList.add(exp);
}
return retList;
} public static List<Map<String, Object>> readXml(String path) {
//考虑可能有多个condition
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
try {
SAXReader reader = new SAXReader();
Document doc = reader.read(new File(path));
Element rootElm = doc.getRootElement();
List<String> nodes = rootElm.elements("CONDITION");
for (Iterator it = nodes.iterator(); it.hasNext();) {
Map<String, Object> map = new HashMap<String, Object>();
Element elm = (Element) it.next();
String exp = elm.attributeValue("exp");
map.put("exp", exp);
List projects = doc.selectNodes("CONDITIONS/CONDITION/*");
Iterator it1 = projects.iterator();
List<Map<String,String>> conList = new ArrayList<Map<String,String>>();
while (it1.hasNext()) {
Map<String,String> conMap = new HashMap<String,String>();
Element elm1 = (Element) it1.next();
String elmname = elm1.getName();
String value = elm1.getStringValue();
String operation = elm1.attributeValue("operation");
System.out.println("elmname=" + elmname + ",operation="
+ operation + ",value=" + value);
conMap.put("name", elmname);
conMap.put("operation", operation==null?"=":operation);
conMap.put("text", value);
conList.add(conMap);
}
map.put("condition", conList);
list.add(map);
}
} catch (Exception ex) {
ex.printStackTrace();
}
return list;
}
}
但是我稍微变更下条件,按照上面的就得不出先要的结果了啊
<?xml version="1.0" encoding="UTF-8"?>
<CONDITIONS>
<CONDITION no="1" sid="000104" exp="1*(2+3)*4">
<RXXSD operation="=">80</RXXSD>
<FHJGJLS operation="=">5</FHJGJLS>
<SJGSDW operation="=">001</SJGSDW>
<GMSFHM operation="=">XXX</GMSFHM>
<XP>base64</XP>
</CONDITION>
</CONDITIONS>
但是我稍微变更下条件,按照上面的就得不出先要的结果了啊
<?xml version="1.0" encoding="UTF-8"?>
<CONDITIONS>
<CONDITION no="1" sid="000104" exp="1*(2+3)*4">
<RXXSD operation="=">80</RXXSD>
<FHJGJLS operation="=">5</FHJGJLS>
<SJGSDW operation="=">001</SJGSDW>
<GMSFHM operation="=">XXX</GMSFHM>
<XP>base64</XP>
</CONDITION>
</CONDITIONS>根据exp表达式来匹配的,这个xml条件1234四个,但是底面确是5个(RXXSD ,FHJGJLS ,SJGSDW ,GMSFHM ,XP )
但是我稍微变更下条件,按照上面的就得不出先要的结果了啊
<?xml version="1.0" encoding="UTF-8"?>
<CONDITIONS>
<CONDITION no="1" sid="000104" exp="1*(2+3)*4">
<RXXSD operation="=">80</RXXSD>
<FHJGJLS operation="=">5</FHJGJLS>
<SJGSDW operation="=">001</SJGSDW>
<GMSFHM operation="=">XXX</GMSFHM>
<XP>base64</XP>
</CONDITION>
</CONDITIONS>根据exp表达式来匹配的,这个xml条件1234四个,但是底面确是5个(RXXSD ,FHJGJLS ,SJGSDW ,GMSFHM ,XP )是的,最后一个是图片格式的BASE64字符。这个是需要的,但没有opertion
但是我稍微变更下条件,按照上面的就得不出先要的结果了啊
<?xml version="1.0" encoding="UTF-8"?>
<CONDITIONS>
<CONDITION no="1" sid="000104" exp="1*(2+3)*4">
<RXXSD operation="=">80</RXXSD>
<FHJGJLS operation="=">5</FHJGJLS>
<SJGSDW operation="=">001</SJGSDW>
<GMSFHM operation="=">XXX</GMSFHM>
<XP>base64</XP>
</CONDITION>
</CONDITIONS>根据exp表达式来匹配的,这个xml条件1234四个,但是底面确是5个(RXXSD ,FHJGJLS ,SJGSDW ,GMSFHM ,XP )是的,最后一个是图片格式的BASE64字符。这个是需要的,但没有opertion那是只需要有operrtion属性的节点吗?他们的顺序还有规定啊?
package shi;import java.io.File;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;/**
*
*
* 业务逻辑是: 对方传入的入参是以XML格式的字符串。我需要解析这个XML,但其中重要的是 exp逻辑关系如何与条件具体项目(RXXSD、CSRQ、XP)
* 组合成 where 条件语句呢?
*
* 并且exp的逻辑关系不仅仅限与这个例子 exp="1*(2+3)*4"
*
* 其中 exp是逻辑关系:*代表与 +代表或 ()代表优先级
*
* 1代表第一个条件具体项目RXXSD 2代表第二个条件具体项目CSRQ 3代表第三个条件具体项目CSRQ 4代表第四个条件具体项目XP
*
*
* 举例说明,我们接受对方的入参XML格式字符串 <?xml version="1.0" encoding="UTF-8"?> <CONDITIONS>
* <CONDITION exp="1*(2+3)*4"> <RXXSD operation="=">71</RXXSD> <CSRQ
* operation=">=">19600101</CSRQ> <CSRQ operation="<=">19900101</CSRQ>
* <XP>tom</XP> </CONDITION> </CONDITIONS>
*
* 如何通过exp="1*(2+3)*4"逻辑关系与具体条件项目组合,最终要拼成SQL语句
*
* select * from table where RXXSD=71 and (CSRQ>=1960 or CSRQ<=1990) and
* XP='tom';
*
* @author Administrator
*
*/
public class Test20 { public static void main(String args[]) throws DocumentException,
MalformedURLException {
//List<Map<String, Object>> list = readXml("F:\\data.xml");
//List<String> retList = createSqlStr(list);
//System.out.println(retList);
List<Map<String, Object>> list2 = readXml("F:\\data2.xml");
List<String> retList2 = createSqlStr(list2);
System.out.println(retList2);
}
public static List<String> createSqlStr(List<Map<String, Object>> list){
List<String> retList = new ArrayList<String>();
for(int i=0;i<list.size();i++){
Map<String,Object> map = list.get(i);
String exp=(String)map.get("exp");
//TODO 该方法可能需要拓展或者重构
exp = converExp(exp,10);
//System.out.println(exp);
List<Map<String,String>> condition = (List<Map<String,String>>)map.get("condition");
for(int j=0;j<condition.size();j++){
Map<String,String> condMap = condition.get(j);
String name = condMap.get("name");
String text = condMap.get("text");
String operation = condMap.get("operation");
exp=exp.replaceAll("#"+(j+1)+"#", " "+name+operation+text+" ");
}
retList.add(exp);
}
return retList;
}
/**
* 把原来的exp表达式中的1、2、3、……替换为#1#、#2#……<br>
* 防止某些节点的内容为1或者2这些<br>
* 当然你也可以替换为其他的比如$1$、$2$……<br>
* @param exp
* @param n 替换的个数(从1-10)目前是10个,当然也有可能更多<br>
* @return
*/
private static String converExp(String exp,int n){
for(int i=1;i<=n;i++){
exp=exp.replaceAll(""+i, "\\#"+i+"\\#");
}
exp = exp.replaceAll("\\*", " and ").replaceAll("\\+", " or ");
return exp;
}
public static List<Map<String, Object>> readXml(String path) {
//考虑可能有多个condition
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
try {
SAXReader reader = new SAXReader();
Document doc = reader.read(new File(path));
Element rootElm = doc.getRootElement();
List<String> nodes = rootElm.elements("CONDITION");
for (Iterator it = nodes.iterator(); it.hasNext();) {
Map<String, Object> map = new HashMap<String, Object>();
Element elm = (Element) it.next();
String exp = elm.attributeValue("exp");
map.put("exp", exp);
List projects = doc.selectNodes("CONDITIONS/CONDITION/*");
Iterator it1 = projects.iterator();
List<Map<String,String>> conList = new ArrayList<Map<String,String>>();
while (it1.hasNext()) {
Map<String,String> conMap = new HashMap<String,String>();
Element elm1 = (Element) it1.next();
String elmname = elm1.getName();
String value = elm1.getStringValue();
String operation = elm1.attributeValue("operation");
System.out.println("elmname=" + elmname + ",operation="
+ operation + ",value=" + value);
conMap.put("name", elmname);
conMap.put("operation", operation==null?"=":operation);
conMap.put("text", value);
if(operation!=null){
conList.add(conMap);
}
}
map.put("condition", conList);
list.add(map);
}
} catch (Exception ex) {
ex.printStackTrace();
}
return list;
}
}
<CONDITIONS>
<CONDITION no="1" sid="000104" exp="1*2*3*4*5*6">
<RXXSD operation="=">80</RXXSD>
<FHJGJLS operation="=">5</FHJGJLS>
<SJGSDW operation="=">001</SJGSDW>
<GMSFHM operation="=">210106198701273019</GMSFHM>
<XM operation="=">留个名</XM>
<XBDM operation="=">1</XBDM>
</CONDITION>
</CONDITIONS>你好,有个严重的问题。条件选项6个,当替换 5的时候呀,因为是 FHJGJLS =5 ,当进行replace的时候,会发生错误!
package shi;import java.io.File;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;import org.apache.commons.lang.StringUtils;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;/**
*
*
* 业务逻辑是: 对方传入的入参是以XML格式的字符串。我需要解析这个XML,但其中重要的是 exp逻辑关系如何与条件具体项目(RXXSD、CSRQ、XP)
* 组合成 where 条件语句呢?
*
* 并且exp的逻辑关系不仅仅限与这个例子 exp="1*(2+3)*4"
*
* 其中 exp是逻辑关系:*代表与 +代表或 ()代表优先级
*
* 1代表第一个条件具体项目RXXSD 2代表第二个条件具体项目CSRQ 3代表第三个条件具体项目CSRQ 4代表第四个条件具体项目XP
*
*
* 举例说明,我们接受对方的入参XML格式字符串 <?xml version="1.0" encoding="UTF-8"?> <CONDITIONS>
* <CONDITION exp="1*(2+3)*4"> <RXXSD operation="=">71</RXXSD> <CSRQ
* operation=">=">19600101</CSRQ> <CSRQ operation="<=">19900101</CSRQ>
* <XP>tom</XP> </CONDITION> </CONDITIONS>
*
* 如何通过exp="1*(2+3)*4"逻辑关系与具体条件项目组合,最终要拼成SQL语句
*
* select * from table where RXXSD=71 and (CSRQ>=1960 or CSRQ<=1990) and
* XP='tom';
*
* @author Administrator
*
*/
public class Test20 { public static void main(String args[]) throws DocumentException,
MalformedURLException {
/*
* List<Map<String, Object>> list = readXml("F:\\data.xml");
*
* List<String> retList = createSqlStr(list);
* System.out.println(retList);
*/ List<Map<String, Object>> list2 = readXml("F:\\data2.xml"); List<String> retList2 = createSqlStr(list2);
System.out.println(retList2);
} public static List<String> createSqlStr(List<Map<String, Object>> list) {
List<String> retList = new ArrayList<String>();
for (int i = 0; i < list.size(); i++) {
Map<String, Object> map = list.get(i);
String exp = (String) map.get("exp");
// TODO 该方法可能需要拓展或者重构
exp = converExp(exp);
// System.out.println(exp);
List<Map<String, String>> condition = (List<Map<String, String>>) map
.get("condition");
for (int j = 0; j < condition.size(); j++) {
Map<String, String> condMap = condition.get(j);
String name = condMap.get("name");
String text = condMap.get("text");
String operation = condMap.get("operation");
exp = exp.replaceAll("#" + (j + 1) + "#", " " + name
+ operation + text + " ");
}
retList.add(exp); } return retList; } /**
* 把原来的exp表达式中的1、2、3、……替换为#1#、#2#……<br>
* 防止某些节点的内容为1或者2这些<br>
* 当然你也可以替换为其他的比如$1$、$2$……<br>
*
* @param exp
* @param n
* 替换的个数(从1-10)目前是10个,当然也有可能更多<br>
* @return
*/
private static String converExp(String exp) {
String regex = "(\\d+)";
exp = exp.replaceAll(regex,"#$1#");
exp = exp.replaceAll("\\*", " and ").replaceAll("\\+", " or ");
return exp;
} public static List<Map<String, Object>> readXml(String path) {
// 考虑可能有多个condition
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
try {
SAXReader reader = new SAXReader();
Document doc = reader.read(new File(path));
Element rootElm = doc.getRootElement();
List<String> nodes = rootElm.elements("CONDITION");
for (Iterator it = nodes.iterator(); it.hasNext();) {
Map<String, Object> map = new HashMap<String, Object>();
Element elm = (Element) it.next();
String exp = elm.attributeValue("exp");
map.put("exp", exp);
List projects = doc.selectNodes("CONDITIONS/CONDITION/*");
Iterator it1 = projects.iterator();
List<Map<String, String>> conList = new ArrayList<Map<String, String>>();
while (it1.hasNext()) {
Map<String, String> conMap = new HashMap<String, String>();
Element elm1 = (Element) it1.next();
String elmname = elm1.getName();
String value = elm1.getStringValue();
String operation = elm1.attributeValue("operation");
System.out.println("elmname=" + elmname + ",operation="
+ operation + ",value=" + value);
conMap.put("name", elmname);
conMap.put("operation", operation == null ? "=" : operation);
conMap.put("text", value);
if (operation != null) {
conList.add(conMap);
} }
map.put("condition", conList);
list.add(map);
} } catch (Exception ex) {
ex.printStackTrace();
}
return list;
}
}