Ruby 小白,求教大家,微信服务器 post xml 到我的服务器上,我该怎么解析?网上查到有些用 params[:xml][:message] 之类的,但是貌似 rails4 以后不能用了
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1348831860</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[this is a test]]></Content>
<MsgId>1234567890123456</MsgId>
</xml>
我要怎么获得 this is a test ?
request.body.read
是正解
http://www.nokogiri.org/ http://www.germane-software.com/software/rexml/
@xmldoc = Nokogiri::XML(request.body.read).xpath('//Content')
我是这样写的,但是返回的是
<Content><![CDATA[this is a test]]></Content>
看起来是 微信的包吧
前面都推荐 Nokogiri
Hash.from_xml
比较直接简单
xml 的模板推荐你用roxml
require "roxml"
module Wechat
module Message
class Base
include ROXML
xml_name :xml
xml_accessor :ToUserName, cdata: true
xml_accessor :FromUserName, cdata: true
xml_reader :CreateTime, as: Integer
xml_reader :MsgType, cdata: true
def initialize
@CreateTime = Time.zone.now.to_i
end
def to_xml
super.to_xml(encoding: "UTF-8", indent: 0, save_with: 0)
end
end
end
end
# <xml>
# <ToUserName><![CDATA[toUser]]></ToUserName>
# <FromUserName><![CDATA[fromUser]]></FromUserName>
# <CreateTime>12345678</CreateTime>
# <MsgType><![CDATA[text]]></MsgType>
# <Content><![CDATA[Hello]]></Content>
# </xml>
module Wechat
module Message
class Text < Base
xml_accessor :Content, cdata: true
def initialize
super
@MsgType = "text"
end
end
end
end
破费
#5 楼 @Rei 另外想问问,能否将返回的 xml 保存为一个对象或者是数组? #6 楼 @zhang_soledad 有具体例子能提供一个吗?刚开始学 rails,然后用 rails 做微信开发,确实问题挺多的,能帮忙,感激不尽
#8 楼 @developlee 我觉得保存原始字符串好了,下次取出再解析,对象序列化反序列化说不定有信息丢失(例如 hash 不支持 xml 属性)。或者数据库原生支持 xml 字段 也可以试试。
如果是微信的,Hash.from_xml
完全适用
xml = <<-XML
<?xml version="1.0" encoding="UTF-8"?>
<hash>
<foo>1</foo>
<bar>2</bar>
</hash>
XML
hash = Hash.from_xml(xml)
# => {"hash"=>{"foo"=>1, "bar"=>2}}
有 api 文档 多试多查
config.middleware.insert_after ActionDispatch::ParamsParser, ActionDispatch::XmlParamsParser
添加下这个配置,params[:xml][:EventKey] 之类的就能直接使用
#13 楼 @michael_miao91 可能我配置有点问题,我是在 config/application.rb 这个文件加的
config.middleware.insert_after ActionDispatch::ParamsParser, ActionDispatch::XmlParamsParser
一看就是对接微信接口的
def xml_to_hash (xml)
begin
require 'active_support/core_ext/hash/conversions'
Hash.from_xml(xml)['xml']
rescue
{}
end
end