文章目录
以下使用的是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的字符串
}