2015-02-05 2 views
0

Обратите внимание, что то, что я хочу, не получить указанный параметр в sevlet, но, чтобы получить параметр из String так:Получить указанный параметр из закодированного URL paramters Строка с Java

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 струна, когда расшифровывает это, питона я могу получить реальные данные, которые он представляет:

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, что я забочусь о том, что более конкретно, я просто хочу в xml из request_tokenres_data

Я знаю, что могу использовать регулярное выражение, чтобы получить эту работу, но есть ли более подходящий способ использовать некоторые lib, такие как apache url lib или что-то еще, что я могу получить более элегантным параметром res_data? Может быть крадут некоторые компоненты из механизма сервлетов?

+0

Просто, чтобы быть уверенным, вы спрашиваете о питона из Java? Кроме того, вы спрашиваете, как извлечь request_token из предоставленного xml? –

+0

@OferLando извините за путаницу, я использую только Python, чтобы получить необработанную строку с кодировкой url, чтобы показать структуру строки, потому что я нахожу, что python очень легко сделать это :-) – armnotstrong

+0

Любая удача с помощью RealSkeptic или моего ответа ? – Thomas

ответ

0

Поскольку вы говорите, что не хотите взломать его регулярным выражением, вы можете использовать правильный синтаксический анализатор XML, хотя для такого небольшого примера это, вероятно, слишком велико.

Если вы можете предположить, что вы можете просто разделить вашу строку на &-х, то есть, нет никаких & 's в там, что сделать не сигнал границы двух пар атрибут-значение, вы можете сначала декодировать строку, а затем извлечь пары атрибут-значение из него и, наконец, использовать 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); 
} 
+0

Вы не используете urldecode до тех пор, пока не разделите параметры. Всегда существует вероятность наличия '&' в одном из параметров, особенно в формате XML, где '&' используется для экранирования. – RealSkeptic

+0

@RealSkeptic Хороший звонок - я изменил код соответствующим образом. – Thomas

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 с помощью регулярного выражения.

Смежные вопросы