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