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