本帖最后由 lgmsyy 于 2014-08-13 11:38:57 编辑

解决方案 »

  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 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="&gt;=">19600101</CSRQ> <CSRQ operation="&lt;=">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;
    }
    }
      

  2.   


    但是我稍微变更下条件,按照上面的就得不出先要的结果了啊
    <?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>
      

  3.   


    但是我稍微变更下条件,按照上面的就得不出先要的结果了啊
    <?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 )
      

  4.   


    但是我稍微变更下条件,按照上面的就得不出先要的结果了啊
    <?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
      

  5.   


    但是我稍微变更下条件,按照上面的就得不出先要的结果了啊
    <?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属性的节点吗?他们的顺序还有规定啊?
      

  6.   

    如果需要是有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="&gt;=">19600101</CSRQ> <CSRQ operation="&lt;=">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;
    }
    }
      

  7.   

    <?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的时候,会发生错误!
      

  8.   

    这个错误已经更正,上面的代码就是但是遇到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="&gt;=">19600101</CSRQ> <CSRQ operation="&lt;=">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;
    }
    }