PBDOM 解析和生成XML

1. PBDOM设置
1)添加pbdom120.pbd(%SYBASE%/Shared/PowerBuilder)到工程的pbl列表中
2) %SYBASE%/Shared/PowerBuilder应该在系统路径或者应用程序的路径中(也就是pbdom要使用此路径下的pbdom120.pbd, PBXerces120.dll,xerces-c_2_6.dll,xerces-depdom_2_6.dll 文件,同样,当程序发布时候也需要)

 

2. order.xml

<?xml version="1.0" encoding="UTF-16LE" standalone="no"?>

<order><order_row My_Attr="MyMusic"><order_no My_order="MyorderNo">HKGHKGEQ10072310913</order_no><order_status>EIS</order_status></order_row><order_row><order_no>HKGHKGSP1007237917</order_no><order_status>STD</order_status></order_row><order_row><order_no>HKGHKGEQ10072310915</order_no><order_status>EIS</order_status></order_row><order_row><order_no>HKGHKGEQ10072310916</order_no><order_status>STD</order_status></order_row><order_row><order_no>HKGHKGEQ10072310917</order_no><order_status>STD</order_status></order_row></order>

 

3. 解析order.xml

 

要点:解析xml 无非是取得tag键值对 和 tag属性的键值对。 pb dom很好的提供这个功能。思路都是先把目标放到一个数组,然后遍历出来,再根据名字得到值。

1) tag键值对 --〉

root = doc.GetRootElement() --〉先得到根tag
root.GetChildElements(children) --> 得到第二层的tag. 你也可以通过同样的方法去得到sub tag 的sub tag. 最后遍历完所有的tag.

 

2) tag属性的键值对

 //get all the attributes
 sub_elements[ll_j].GetAttributes(node_attribute)  --> 得到所有的tag属性名

 ls_attribute = node_attribute[2].GetQualifiedName()
 messagebox("order node_attribute",ls_attribute)
 ls_attribute = node_attribute[2].GetName()
 messagebox("order node_attribute",ls_attribute)
 messagebox("order attribute value",node_attribute[2].getText())  -->得到所有的tag属性名

 

3)代码示例,不具备通用性,无法处理所有的xml,仅仅是演示如何取xml的值。

 


pbdom_builder builder
pbdom_document doc

pbdom_element root
pbdom_element children[]
pbdom_element node_element

long ll_i, ll_j
string ls_value
string ls_date , ls_time
builder = create pbdom_builder
doc = builder.buildfromstring(as_str)

// Get the root element of the document
//判断节点
if doc.HasRootElement() then
//获取根tag
root = doc.GetRootElement()

//get the child elements under <order>, in other words, get the total nodes for "<order_row>"
//获取第二层的tag
root.GetChildElements(children)

//获取tag上界,循环遍历
for ll_i = 1 to UpperBound(children)
//get the sub node info

//取出循环中当前的tag
node_element = children[ll_i]
//获取tag属性值
ls_value = node_element.gettext( ) 
//判断tag属性名,遍历,存储tag属性值到 结构体
choose case lower(node_element.GetQualifiedName())
case 'return_code'
at_weixin.return_code = ls_value
case 'return_msg '
at_weixin.return_msg = ls_value
case 'appid'
at_weixin.appid = ls_value
case 'mch_id'
at_weixin.mch_id = ls_value
case 'nonce_str'
at_weixin.nonce_str = ls_value
case 'sign'
at_weixin.sign = ls_value
case 'result_code'
at_weixin.result_code = ls_value
case 'device_info'
at_weixin.device_info = ls_value
case 'openid'
at_weixin.openid = ls_value
case 'is_subscribe'
at_weixin.is_subscribe = ls_value
case 'trade_type'
at_weixin.trade_type = ls_value
case 'trade_state'
at_weixin.trade_state = ls_value
ls_value = upper(ls_value)
choose case ls_value
case 'REFUND'
at_weixin.trade_state_exp = '转入退款 '
case 'SUCCESS'
at_weixin.trade_state_exp = '支付成功 '
case 'NOTPAY'
at_weixin.trade_state_exp = '未支付 '
case 'CLOSED'
at_weixin.trade_state_exp = '已关闭 '
case 'REVOKED'
at_weixin.trade_state_exp = '已撤销(刷卡支付) '
case 'USERPAYING'
at_weixin.trade_state_exp = '用户支付中 '
case 'PAYERROR'
at_weixin.trade_state_exp = '支付失败(其他原因,如银行返回失败) '
end choose

case 'bank_type'
at_weixin.bank_type = ls_value
case 'total_fee'
if isnumber(ls_value) then
at_weixin.total_fee = long(ls_value)
end if
case 'cash_fee'
if isnumber(ls_value) then
at_weixin.cash_fee = long(ls_value)
end if
case 'coupon_fee'
if isnumber(ls_value) then
at_weixin.coupon_fee = long(ls_value)
end if
case 'coupon_count '
if isnumber(ls_value) then
at_weixin.coupon_count = long(ls_value)
end if
case 'cash_fee_type'
at_weixin.cash_fee_type = ls_value
case 'transaction_id'
at_weixin.transaction_id = ls_value
case 'out_trade_no'
at_weixin.out_trade_no = ls_value
case 'out_refund_no'
at_weixin.out_refund_no = ls_value
case 'out_refund_no_0'
at_weixin.out_refund_no = ls_value
case 'refund_id'
at_weixin.refund_id = ls_value
case 'refund_id_0'
at_weixin.refund_id = ls_value
case 'attach'
at_weixin.attach = ls_value
case 'err_code'
at_weixin.err_code = ls_value
case 'err_code_des'
at_weixin.err_code_des = ls_value
case 'refund_success_time'
if isdate(left(ls_value,10)) and istime(mid(ls_value,12)) then
at_weixin.refund_success_time = datetime(date(left(ls_value,10)) ,time(mid(ls_value,12)))
end if
case 'refund_success_time_0'
if isdate(left(ls_value,10)) and istime(mid(ls_value,12)) then
//messagebox("1",ls_value)
at_weixin.refund_success_time = datetime(date(left(ls_value,10)) ,time(mid(ls_value,12)))
end if
//messagebox("",ls_value)
case 'time_end'
at_weixin.time_end = ls_value
ls_date = mid(ls_value,1,4) + "-" + mid(ls_value,5,2) + "-" + mid(ls_value,7,2) 
ls_time = mid(ls_value,9,2) + ":" + mid(ls_value,11,2) + ":" + mid(ls_value,13,2)
if isdate(ls_date) and istime(ls_time) then
at_weixin.paytime = datetime(date(ls_date) , time(ls_time))
end if
case 'trade_state_desc'
at_weixin.trade_state_desc = ls_value
end choose
next
else
return 0
end if

if isnull(at_weixin.trade_state_exp) then at_weixin.trade_state_exp = ''
if isnull(at_weixin.trade_state_desc) then at_weixin.trade_state_desc = ''


//返回tag数量
return ll_i

--------------------- 
原文:https://blog.csdn.net/lxqluo/article/details/6109144?utm_source=copy 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值