从编码的url参数中获取特定参数

时间:2015-02-05 09:42:30

标签: java xml urldecode

请注意,我想要的不是在sevlet中获取指定参数,而是从String获取参数:

res_data=%3C%3Fxml+version%3D%221.0%22+encoding%3D%22utf8%22%3F%3E%3Cdirect_trade_create_res%3E%3Crequest_token%3E201502051324ee4d4baf14d30e3510808c08ee1d%3C%2Frequest_token%3E%3C%2Fdirect_trade_create_res%3E&service=alipay.wap.trade.create.direct&sec_id=MD5&partner=2088611853232587&req_id=20121212344553&v=2.0

这是一个url编码的utf-8字符串,当用python解码时我可以得到它代表的真实数据:

res_data=<?xml version="1.0" encoding="utf-8"?><direct_trade_create_res><request_token>201502051324ee4d4baf14d30e3510808c08ee1d</request_token></direct_trade_create_res>&service=alipay.wap.trade.create.direct&sec_id=MD5&partner=2088611853232587&req_id=20121212344553&v=2.0

我想获得我关心的参数res_data,更具体地说,我只想要request_token xml中的res_data

我知道我可以使用正则表达式来完成这项工作,但有没有更合适的方法来使用像apache url lib这样的lib或其他我可以更优雅地获得res_data参数的其他方法?可能从servlet机制窃取一些组件?

2 个答案:

答案 0 :(得分:0)

您可以使用java.net.URLDecoder。假设参数位于名为param的字符串中(并且您已将其与&连接的其他参数分开):

String[] splitString = param.split("=");
String realData = null;
try {
    String realData = java.net.URLDecoder.decode( splitString[1], "UTF-8" );
} catch ( UnsupportedEncodingException e ) {
    // Nothing to do, it should not happen as you supplied a standard one
}

一旦这样做,您可以使用您选择的XML解析器解析它并提取您想要的任何内容。但是,不要尝试使用正则表达式解析XML。

答案 1 :(得分:0)

既然你说你不想用正则表达式破解它,你可能会使用一个合适的XML解析器,虽然对于这么小的例子,它可能有点过分。

如果你可以假设你可以简单地在&上分割你的字符串,也就是说,那里没有任何& 不要发信号通知两个属性 - 值对的边界,你可以先解码字符串,然后从中提取属性 - 值对,最后使用DOM解析器+ XPath来获取请求令牌:

// split up URL parameters into attribute value pairs
String[] pairs = s.split("&");

// expect the first attribute/value pair to contain the data
// and decode the URL escape sequences
String resData = URLDecoder.decode(pairs[0], "utf-8");

int equalIndex = resData.indexOf("=");
if (equalIndex >= 0) {
    // the value is right of the '=' sign
    String xmlString = resData.substring(equalIndex + 1);

    // prepare XML parser
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    DocumentBuilder parser = dbf.newDocumentBuilder();

    InputSource is = new InputSource(new StringReader(xmlString));
    Document doc = parser.parse(is);

    // prepare XPath expression to extract request token
    XPath xpath = XPathFactory.newInstance().newXPath();
    XPathExpression xp = xpath.compile("//request_token/text()");

    String requestToken = xp.evaluate(doc);
}