java中使用jdom生成与解析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>1</id>
	<name>java基础</name>
	<isbn><![CDATA[123456]]></isbn>
</book>
分析

book节点,有三个子节点:id和name。id节点有文本内容,1。name节点有文本内容,java基础。isbn,节点有<![CDATA[123456]]>。
而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的字符串
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
一、JDOM 简介 JDOM是一个开源项目,它基于树型结构,利用纯JAVA的技术对XML文档实现解析生成、序列化以及多种操作。 JDOM 直接为JAVA编程服务。它利用更为强有力的JAVA语言的诸多特性(方法重载、集合概念以及映射),把SAX和DOM的功能有效地结合起来。 在使用设计上尽可能地隐藏原来使用XML过程的复杂性。利用JDOM处理XML文档将是一件轻松、简单的事。 JDOM 在2000年的春天被Brett McLaughlin和Jason Hunter开发出来,以弥补DOM及SAX在实际应用当的不足之处。 这些不足之处主要在于SAX没有文档修改、随机访问以及输出的功能,而对于DOM来说,JAVA程序员在使用时来用起来总觉得不太方便。 DOM的缺点主要是来自于由于Dom是一个接口定义语言(IDL),它的任务是在不同语言实现的一个最低的通用标准,并不是为JAVA特别设计的。JDOM的最新版本为JDOM Beta 9。最近JDOM被收录到JSR-102内,这标志着JDOM成为了JAVA平台组成的一部分。 二、JDOM 包概览 JDOM是由以下几个包组成的 org.jdom 包含了所有的xml文档要素的java类 org.jdom.adapters 包含了与dom适配的java类 org.jdom.filter 包含了xml文档的过滤器类 org.jdom.input 包含了读取xml文档的类 org.jdom.output 包含了写入xml文档的类 org.jdom.transform 包含了将jdom xml文档接口转换为其他xml文档接口 org.jdom.xpath 包含了对xml文档xpath操作的类三、JDOM 类说明 1、org.JDOM这个包里的类是你J解析xml文件后所要用到的所有数据类型。 Attribute CDATA Coment DocType Document Element EntityRef Namespace ProscessingInstruction Text 2、org.JDOM.transform在涉及xslt格式转换时应使用下面的2个类 JDOMSource JDOMResult org.JDOM.input 3、输入类,一般用于文档的创建工作 SAXBuilder DOMBuilder ResultSetBuilder org.JDOM.output 4、输出类,用于文档转换输出 XMLOutputter SAXOutputter DomOutputter JTreeOutputter 使用前注意事项: .........

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白说(๑• . •๑)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值