用dom4j解析xml,soap报文

package demo4j;

import java.io.BufferedReader;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

import java.util.Iterator;
import java.util.List;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;


public class demo1 {

    /*
     * 字符串解析xml
     * 
     */
    public static void parseStr(){
        /*
         * 
         */
        String str = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"+  
                     " <四大名著>"+  
                        "<西游记 id=\"x001\">"+  
                           "<作者>吴承恩1</作者>"+  
                           "<作者>吴承恩2</作者>"+  
                            "<朝代>明朝</朝代>"+  
                        "</西游记> "+ 
                        "<红楼梦 id=\"x002\">"+  
                         "<作者>曹雪芹</作者>"+  
                         "</红楼梦> "+ 
                       "</四大名著>";

        try {

            Document document  = DocumentHelper.parseText(str);
            //获取根节点元素,此处为<四大名著>
            Element node = document.getRootElement();
            //通过element()获得指定节点名称的节点,在这里是<西游记>这个节点不包括<红楼梦>
            Element xiyouji = node.element("西游记");
            //获得所在节点的节点名称
            String elementName = xiyouji.getName();
            //获取<西游记>节点所具有的属性,输入需要的属性名称id
            Attribute attribute = xiyouji.attribute("id");
            //获得属性文本 x001
            String txt = attribute.getText();
            //通过elements()获取node下的所有字节,返回时一个包含所有节点的集合对象。
            List child = xiyouji.elements();
            for(Iterator it=child.iterator();it.hasNext();){
                Element element = (Element)it.next();
                System.out.println(element.getTextTrim());

            }
            System.out.println(txt);

        } catch (DocumentException e) {
            e.printStackTrace();
        }

    }
    /*
     * xml文件解析
     * 
     */

    public static void parseXmlFile() {

        StringBuffer sb = new StringBuffer("");
        //从文件csdn.txt中将内容读取到sb字符串中
         try {
            FileReader reader = new FileReader("demo/csdn.txt");
            BufferedReader br = new BufferedReader(reader);
            String str = "";
            while((str = br.readLine())!= null){
                sb.append(str.trim());
            }
             br.close();
             reader.close();
            // System.out.println(sb);
            //解析读取进来的soapUI报文,先不用转义不然parseText会报错,获得document对象
             Document document  = DocumentHelper.parseText(sb.toString()); 
             document.getRootElement();
             Element out = 
                     document.getRootElement().element("Body").element("odsInterfaceResponse").element("out");
             //在解析一次
             Element custResponses = DocumentHelper.parseText(out.getText()).getRootElement();
             Element cust = custResponses.element("cust");
             System.out.println(cust);
             StringBuffer sb1 = new StringBuffer("");
             for(Iterator it = cust.elementIterator();it.hasNext();){
                 Element elem = (Element)it.next();
                 if(elem.getName().equals("recomContent")){
                    String recomContent = elem.getTextTrim()+"。";
                    sb1.append(recomContent);
                 }
                 if(elem.getName().equals("recomReson")){
                    String recomReson = elem.getTextTrim();
                    sb1.append(recomReson);
                 }
             }

             System.out.println(sb1.toString());

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {

        //parseStr();
        parseXmlFile();

    }

}

demo/dscn.txt 文件为:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soap:Body><ns1:odsInterfaceResponse xmlns:ns1="http://webservice.ods.ffcs.cn"><ns1:out>&lt;?xml version="1.0" encoding="UTF-8"?>&lt;custResponses>&lt;ROW_NUM>1&lt;/ROW_NUM>&lt;errorMsg>营销单共享成功&lt;/errorMsg>&lt;errorCode>0&lt;/errorCode>&lt;cust>&lt;custId>28909989&lt;/custId>&lt;prodId>15962435&lt;/prodId>&lt;custTel>059522280108&lt;/custTel>&lt;recomId>306484878&lt;/recomId>&lt;recomContent>家庭宽带副卡暑期精准营销活动&lt;/recomContent>&lt;recomReson>根据用户套餐使用情况及清单中的高转网意愿异网号码,开展融合增开副卡营销工作,结合免费副卡(部分地市)、副卡红包、高值套餐副卡无限流量、增装副卡宽带提速、副卡保底终端补贴等政策推荐新装副卡&lt;/recomReson>&lt;mktgPlanId>9923&lt;/mktgPlanId>&lt;/cust>&lt;/custResponses></ns1:out></ns1:odsInterfaceResponse></soap:Body></soap:Envelope>

### Java 微信公众号 实现 获取 OpenID 示例代码 为了通过Java项目实现微信公众号获取OpenID功能,可以按照以下方法操作。此过程涉及使用AppID、AppSecret以及用户授权码(code),并通过调用微信API来获得用户OpenID。 #### 准备工作 确保已经注册并配置好微信公众平台账号,并拥有合法的应用程序标识符(AppID)和应用程序密钥(AppSecret)[^1]。 #### 用户授权重定向URL构建 当用户访问应用时,需先引导其至微信OAuth2.0授权页面完成登录授权动作: ```java // 构建授权链接 String appId = "your_appid"; // 替换成实际的appid String redirectUrl = URLEncoder.encode("http://example.com/callback", "UTF-8"); // 回调地址编码处理 String scope = "snsapi_base"; // 如果只需要获取openid则设置为snsapi_base;如果还需要其他信息,则设为snsapi_userinfo StringBuilder authUrlBuilder = new StringBuilder(); authUrlBuilder.append("https://open.weixin.qq.com/connect/oauth2/authorize?") .append("appid=").append(appId) .append("&redirect_uri=").append(redirectUrl) .append("&response_type=code&scope=").append(scope).append("#wechat_redirect"); ``` #### 处理回调请求中的Code参数 一旦用户同意授权后会被重定向回指定的`redirect_url?code=CODE&state=STATE`路径,在这里可以从HTTP GET请求中提取出临时票据(code),用于下一步换取access_token及openid: ```java @WebServlet("/callback") public class CallbackServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String code = request.getParameter("code"); if (null != code && !"".equals(code.trim())) { try { // 使用code去交换access_token 和 openid String accessTokenAndOpenId = getAccessTokenAndOpenIdByCode(code); // 解析返回的结果... } catch (Exception e) { logger.error(e.getMessage(), e); } } // 继续后续逻辑... } } ``` #### 调用接口获取Access Token 及 OpenID 最后一步就是利用上一步得到的code向微信服务器发起POST请求以获取最终所需的access_token与openid组合数据包: ```java private static final String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/sns/oauth2/access_token"; /** * 根据授权后的code获取access_token和openid. */ private String getAccessTokenAndOpenIdByCode(String code) throws Exception{ Map<String,Object> params = Maps.newHashMap(); params.put("appid","your_appid"); params.put("secret","your_secret"); params.put("code",code); params.put("grant_type","authorization_code"); ResponseEntity<String> resultEntity = RestTemplateUtil.postForResponseEntity(ACCESS_TOKEN_URL,params); JSONObject jsonObject = JSON.parseObject(resultEntity.getBody()); return JsonUtils.toJSONString(jsonObject); // 返回json字符串形式的数据给前端解析 } ``` 上述代码片段展示了如何在一个典型的Web环境中集成微信OAuth2.0认证机制从而安全有效地取得用户的唯一身份识别号——OpenID
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值