java中使用jdom生成与解析xml文本——微信公众号服务器接收并返回xml格式字符串的推送数据例子

文章目录

      • 生成一个简单xml数据格式文本
        • 分析
        • java代码
        • 格式化xml为字符串
      • 解析xml文本
        • 直接解析根元素下的xml文本
        • 结果
        • 根据输入流解析xml文档
      • 微信公众号服务器接收并返回xml格式字符串的推送数据例子

以下使用的是jdom包来解析的xml数据,如果你是用的是maven请导入:

        <!-- org.jdom/jdom ,解析小体量xml-->
        <dependency>
            <groupId>org.jdom</groupId>
            <artifactId>jdom</artifactId>
            <version>1.1</version>
        </dependency>

如果你是web项目请百度搜索jdom,到官网去下载。

生成一个简单xml数据格式文本

<book>
	<id>1id>
	<name>java基础name>
	<isbn>isbn>
book>

分析

book节点,有三个子节点:id和name。id节点有文本内容,1。name节点有文本内容,java基础。isbn,节点有
而id,name,isbn都是属于book节点的内容。

java代码

 //创建element,xml的节点元素
 Element book= new Element("book");  //创建节点book
 Element id = new Element("id");  //创建节点id
 Element name= new Element("name"); //创建节点name
 Element isbn= new Element("isbn");
 id.addContent("1");  //id节点添加文本内容,1
 name.addContent("Java基础"); //name节点添加文本内容
 isbn.addContent(new CDATA("123456"));
 book.addContent(id);   //book节点添加子节点id
 book.addContent(name);  //book节点添加子节点name
 book.addContent(isbn);

格式化xml为字符串

XMLOutputter xmlOutputter = new XMLOutputter();
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
xmlOutputter.output(boo, byteArrayOutputStream1);
//输出xml格式化后的字符串
System.out.println("xml数据:" + outputStream .toString("utf-8"));

解析xml文本

直接解析根元素下的xml文本

	//传入book一个文档的根元素,到document中
   Document document = new Document(book);
   //获取到这个文档的根节点,book
   Element rootElement = document.getRootElement();
   String id = rootElement.getChildText("id"); //获取节点为id的文本内容
   String name = rootElement.getChildText("name");//获取节点为name的文本内容
   String isbn = rootElement.getChildText("isbn");
   System.out.println("id::" + id + ",name::" + name + ",isbn::" + isbn);

结果

在这里插入图片描述

根据输入流解析xml文档

//获取流...
InputStream InputStream = new FileInputStream(new File("/path/*.xml"));

//根据输入流获取到xml的文档
Document document = new SAXBuilder().build(inputStream);
//获取xml文本的根元素
Element rootElement = document.getRootElement();
//...
//同样根据rootElement获取文本内容

微信公众号服务器接收并返回xml格式字符串的推送数据例子

在微信公众号里面有这样一个例子,微信用户关注公众号,微信公众号服务器,返回一个xml字符串,可以给用户被动推送消息。

注!!!以下示例缺少大量代码。关键代码在获取流解析xml信息和封装一个xml的字符串返回给微信服务器。

	//接收微信服务器推送的xml格式数据
    @PostMapping("index")
    public String postIndex(HttpServletRequest request) {
        String result = "";
        try {
            //获取数据输入流,读取,微信服务器推送的xml信息
            ServletInputStream inputStream = request.getInputStream();
            //根据输入流获取到xml的文档
            Document document = new SAXBuilder().build(inputStream);
            //获取xml文本的根元素
            Element rootElement = document.getRootElement();
            result = wxUserService.updateWXMessage(rootElement); //操作微信传来的消息,并返回推送的结果
        } catch (IOException e) {
            e.printStackTrace();
        } catch (JDOMException e) {
            e.printStackTrace();
        }
        return result;
    }
//解析微信服务器,推送的信息
public String updateWXMessage(Element rootElement) {
        //根据根元素,获取到子节点的文本信息,xml
        //xml解析微信服务器传递来的消息内容
        String toUserName = rootElement.getChildText("ToUserName"); //开发者微信号
        String fromUserName = rootElement.getChildText("FromUserName"); //OpenID
        String createTime = rootElement.getChildText("CreateTime"); //消息创建时间 (整型)
        String msgType = rootElement.getChildText("MsgType"); //消息类型,event
        String event = rootElement.getChildText("Event"); 
        WXMessage wxMessage = new WXMessage();
        wxMessage.setMsgType(msgType);
        wxMessage.setToUserName(toUserName);
        wxMessage.setFormUserName(fromUserName);
        wxMessage.setCreatTime(createTime);
        wxMessage.setEvent(event);
        ///**************
        String resultXML = checkMsgTypeAndResultXML(wxMessage);
        return resultXML;
    }
/**
     * 返回给用户一条图文信息
     *
     * @param wxMessage
     * @return
     */
    private String resultNewsXml(WXMessage wxMessage) {
        String resultStr = "";
        //怎么生成一个xml结果呢?
        //1、根据微信开发文档指示,生成一个xml的根节点
        Element xml = new Element("xml");
        //2、一个ToUserName节点,以及节点内容,openID
        Element toUserName = new Element("ToUserName");
        toUserName.addContent(new CDATA(wxMessage.getFormUserName()));
        xml.addContent(toUserName);
        //3、FromUserName,开发者微信号
        Element fromUserName = new Element("FromUserName");
        fromUserName.addContent(new CDATA(wxMessage.getToUserName()));
        xml.addContent(fromUserName);
        //4、CreateTime消息创建时间
        Element createTime = new Element("CreateTime");
        createTime.addContent(System.currentTimeMillis() / 1000 + "");
        xml.addContent(createTime);
        //5、消息类型MsgType
        Element msgType = new Element("MsgType");
        msgType.addContent(new CDATA("news"));
        xml.addContent(msgType);
        //6、ArticleCount图文消息个数
        Element articleCount = new Element("ArticleCount");
        articleCount.addContent("3");
        xml.addContent(articleCount);
        //7、Articles图文消息信息
        Element articles = new Element("Articles");
        //8、item,第一条文章,item就是需要循环插入的内容
        List<WX_Msgdetails> wx_msgdetails = wX_msgMapper.selectMsgDetailsByActivate(wxMessage.getEvent());
        for (WX_Msgdetails wx_msgdetail : wx_msgdetails) {
            // String[] wxd = wx_msgdetail.getType().split("|");  //分割消息的类型
            Element item = new Element("item");  //循环创建的消息条数
            //Title
            Element title = new Element("Title");
            title.addContent(new CDATA(wx_msgdetail.getTitle()));
            item.addContent(title);
            //Description
            Element description = new Element("Description");
            description.addContent(new CDATA(wx_msgdetail.getDescription()));
            item.addContent(description);
            //PicUrl
            Element picUrl = new Element("PicUrl");
            picUrl.addContent(new CDATA(Constant.PREX_URL + wx_msgdetail.getPicurl()));
            item.addContent(picUrl);
            //Url
            Element url = new Element("Url");
            url.addContent(new CDATA(Constant.PREX_URL + wx_msgdetail.getUrl()));
            item.addContent(url);
            articles.addContent(item);  //添加到文章当中
        }
        xml.addContent(articles);

        try {
            //xml格式化成字符串
            Format format = Format.getCompactFormat();
            format.setEncoding("utf-8"); //设置格式化的字符集
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            XMLOutputter xmlOutputter = new XMLOutputter();
            xmlOutputter.output(xml, byteArrayOutputStream);
            resultStr = byteArrayOutputStream.toString("utf-8");
            //把节点Element,转换成一个字符串
            System.out.println(resultStr);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return resultStr;  //返回xml的字符串
    }

你可能感兴趣的:(#,java,java,xml)