Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用java从编码的url参数字符串获取指定参数_Java_Xml_Urldecode - Fatal编程技术网

使用java从编码的url参数字符串获取指定参数

使用java从编码的url参数字符串获取指定参数,java,xml,urldecode,Java,Xml,Urldecode,请注意,我想要的不是在sevlet中获取指定参数,而是从如下字符串获取参数: 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&am

请注意,我想要的不是在sevlet中获取指定参数,而是从如下字符串获取参数:

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,更具体地说,我只想要res_data的xml中的request_令牌

我知道我可以使用regex来完成这项工作,但是有没有更合适的方法来使用一些库,比如apacheurl-lib或其他我可以更优雅地获取res_数据参数的东西?可能是从servlet机制中窃取了一些组件

您可以使用java.net.url解码器。假设该参数位于名为param的字符串中,并且您已经将其与通过&连接到它的其他参数分开:


一旦您这样做了,您就可以使用您选择的XML解析器对其进行解析,并提取您想要的任何内容。不过,不要试图用正则表达式解析XML。

既然你说你不想用正则表达式来破解它,那么你可以使用一个合适的XML解析器,尽管对于这样一个小例子来说,这可能有些过头了

如果您可以假设您可以简单地在&’s上拆分字符串,即其中没有任何&’s不表示两个属性值对的边界,那么您可以首先解码字符串,然后从中提取属性值对,最后使用DOM解析器+XPath访问请求令牌:

//将URL参数拆分为属性值对 字符串[]对=s.split&; //期望第一个属性/值对包含数据 //并解码URL转义序列 字符串resData=urldecover.decodepairs[0],utf-8; int equalIndex=resData.indexOf=; 如果equalIndex>=0{ //该值位于“=”符号的右侧 字符串xmlString=resData.substringequalIndex+1; //准备XML解析器 DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance; DocumentBuilder parser=dbf.newDocumentBuilder; InputSource is=new InputSourcenew StringReaderxmlString; Document doc=parser.parseis; //准备XPath表达式以提取请求令牌 XPath=XPathFactory.newInstance.newXPath; XPathExpression xp=xpath.compile//request\u token/text; 字符串requestToken=xp.evaluatedoc; }
可以肯定的是,你是在问Java的python吗?另外,您是否在问如何从提供的xml中提取请求令牌?@OferLando抱歉,我只使用Python对原始url编码的字符串进行解码,以显示字符串的结构,因为我发现Python很容易做到这一点:-真怀疑论者或我的答案有什么问题吗?@Thomas我最终使用了您提到的方法,首先按拆分&然后为每个拆分找到res_数据并替换前缀res_data=,然后url解码并将其传递给xml解析。谢谢您的回答。在拆分参数之前,您不会进行URL解码。在其中一个参数中,尤其是XML中,总是有可能出现&的情况,其中&用于转义。@realponsign很好的调用-我相应地更改了代码。
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
}