常会遇到需要对xml文件进行编辑修改的情况,尝试了一下使用python对其进行解析及修改。
# encoding:utf-8
import xml.etree.ElementTree as ET
from xml.dom.minidom import parseString
import codecs
import sys
def get_xml_dict(source_file_name, id_dict):
tree = ET.parse(source_file_name)
root = tree.getroot()
fields = root.find('fields')
for field in fields:
items = field.findall('item')
for item in items:
id = item.get('id')
desc = item.get('desc')
id_dict[id] = desc
def write_macros_xml(macros_file_name, id_dict):
macros = ET.Element('macros')
for id in id_dict:
macro = ET.SubElement(macros, 'macro')
macro.set('id', id)
macro.set('desc', id_dict[id])
xml_dom = parseString(ET.tostring(macros))
xml_content = xml_dom.toprettyxml('\t')
xml_file = codecs.open(macros_file_name, "w+", 'utf-8-sig')
xml_file.write(xml_content)
xml_file.close()
if __name__ == "__main__":
if len(sys.argv) < 3:
print "Usage: stepmerge.py source_file_name macros_file_name"
exit(-1)
source_file_name = sys.argv[1]
macros_file_name = sys.argv[2]
id_dict = {}
get_xml_dict(source_file_name, id_dict)
write_macros_xml(macros_file_name, id_dict)
待解析的xml文件:
<?xml version="1.0" encoding="utf-8"?>
<ufxstep>
<packages>
<package name="RspLogin" funcid="331100" desc="登录回报">
<field name="RspLogin"/>
</package>
<package name="RspQryAccount" funcid="331155" desc="查询账户回报">
<field name="Account"/>
</package>
<package name="RspClientSessionID" funcid="331480" desc="获取客户端连会话ID">
<field name="RspClientSessionID"/>
</package>
<package name="RspClientAuth" funcid="331481" desc="客户端认证">
<field name="RspClientAuth"/>
</package>
<package name="RspClientInfoSubmit" funcid="331482" desc="客户端系统信息上报">
<field name="RspClientInfoSubmit"/>
</package>
<package name="RspQryInstrument" funcid="338000" desc="查询合约回报">
<field name="Instrument"/>
</package>
<package name="RtnMarketData" funcid="620003" desc="实时行情主推">
<field name="MarketData"/>
</package>
</packages>
<fields>
<field name="RspLogin" desc="登录应答">
<item id="init_date" desc="交易日期"/>
<item id="sys_status" desc="系统状态"/>
<item id="company_name" desc="公司名称"/>
<item id="content_type" desc="银行号、市场类别"/>
<item id="account_content" desc="输入内容"/>
<item id="branch_no" desc="分支机构"/>
<item id="client_id" desc="客户编号"/>
<item id="client_name" desc="客户姓名"/>
<item id="corp_client_group" desc="公司客户类别"/>
<item id="corp_risk_level" desc="客户风险等级"/>
<item id="corp_end_date" desc="客户风险到期日"/>
<item id="valid_flag" desc="有效标志"/>
<item id="fundaccount_count" desc="资产账号个数"/>
<item id="fund_account" desc="资产账户"/>
<item id="client_rights" desc="客户权限"/>
<item id="last_op_entrust_way" desc="上次登录委托方式"/>
<item id="last_op_station" desc="上次登录站点/电话"/>
<item id="sysnode_id" desc="系统节点编号"/>
<item id="user_token" desc="用户口令"/>
<item id="error_no" desc="错误代码"/>
<item id="error_info" desc="错误提示"/>
<item id="asset_prop" desc="资产属性"/>
<item id="product_flag" desc="产品标志"/>
<item id="message_flag" desc="消息标志"/>
<item id="tabconfirm_flag" desc="强制账单确认"/>
<item id="last_date" desc="上次提成日期"/>
<item id="session_no" desc="会话编号"/>
<item id="foreign_flag" desc="境外标志"/>
</field>
<field name="Account" desc="账户">
<item id="client_branch_no" desc="客户开户营业部"/>
<item id="branch_no" desc="分支机构"/>
<item id="client_id" desc="客户编号"/>
<item id="fund_account" desc="资产账户"/>
<item id="client_rights" desc="客户权限"/>
<item id="main_flag" desc="主账标志"/>
<item id="product_flag" desc="产品标志"/>
<item id="asset_prop" desc="资产属性"/>
<item id="sysnode_id" desc="系统节点编号"/>
<item id="position_str" desc="定位串"/>
<item id="uft_sysnode_id" desc="UFT系统节点编号"/>
<item id="en_ext_rights" desc="客户扩权限串"/>
<item id="profit_flag" desc="盈亏计算方式"/>
</field>
<field name="RspClientSessionID" desc="客户端会话ID">
<item id="session_id" desc="会话号"/>
</field>
<field name="RspClientAuth" desc="客户端认证">
</field>
<field name="RspClientInfoSubmit" desc="客户端系统信息上报">
</field>
<field name="Instrument" desc="合约">
<item id="exchange_type" desc="交易类别"/>
<item id="option_code" desc="期权合约编码"/>
<item id="optcontract_id" desc="合约交易代码"/>
<item id="option_name" desc="期权合约简称"/>
<item id="option_type" desc="期权种类"/>
<item id="stock_type" desc="证券类别"/>
<item id="stock_code" desc="证券代码"/>
<item id="money_type" desc="币种代码"/>
<item id="amount_per_hand" desc="合约乘数"/>
<item id="option_mode" desc="期权执行方式"/>
<item id="opt_close_price" desc="合约前收盘价"/>
<item id="close_price" desc="昨收盘"/>
<item id="opt_up_price" desc="上限价"/>
<item id="opt_down_price" desc="下限价"/>
<item id="exercise_price" desc="行权价格"/>
<item id="initper_balance" desc="单位保证金"/>
<item id="limit_high_amount" desc="单笔限价申报最高数量"/>
<item id="limit_low_amount" desc="单笔限价申报最低数量"/>
<item id="mkt_high_amount" desc="单笔市价申报最高数量"/>
<item id="mkt_low_amount" desc="单笔市价申报最低数量"/>
<item id="begin_date" desc="起始日期"/>
<item id="end_date" desc="到期日期"/>
<item id="exe_begin_date" desc="行权开始日期"/>
<item id="exe_end_date" desc="行权截止日期"/>
<item id="optcode_status" desc="期权代码状态"/>
<item id="opt_updated_status" desc="期权合约调整标志"/>
<item id="option_version" desc="期权合约版本号"/>
<item id="opt_open_status" desc="期权开仓状态"/>
<item id="option_flag" desc="期权合约挂牌标志"/>
<item id="opt_final_status" desc="期权合约临近到期标志"/>
<item id="opt_price_step" desc="最小价差(元)"/>
<item id="position_str" desc="定位串"/>
</field>
<field name="MarketData" desc="实时行情">
<item id="hqsrc_type" desc="行情源类型"/>
<item id="exchange_type" desc="交易类别"/>
<item id="option_code" desc="期权合约编码"/>
<item id="option_name" desc="期权合约简称"/>
<item id="close_price" desc="昨收盘"/>
<item id="open_price" desc="开盘价"/>
<item id="business_balance" desc="成交金额"/>
<item id="high_price" desc="最高价"/>
<item id="low_price" desc="最低价"/>
<item id="last_price" desc="最新价"/>
<item id="business_amount" desc="成交数量"/>
<item id="buy_price1" desc="申买价1"/>
<item id="buy_price2" desc="申买价2"/>
<item id="buy_price3" desc="申买价3"/>
<item id="buy_price4" desc="申买价4"/>
<item id="buy_price5" desc="申买价5"/>
<item id="buy_price6" desc="申买价6"/>
<item id="buy_price7" desc="申买价7"/>
<item id="buy_price8" desc="申买价8"/>
<item id="buy_price9" desc="申买价9"/>
<item id="buy_price10" desc="申买价10"/>
<item id="sale_price1" desc="申卖价1"/>
<item id="sale_price2" desc="申卖价2"/>
<item id="sale_price3" desc="申卖价3"/>
<item id="sale_price4" desc="申卖价4"/>
<item id="sale_price5" desc="申卖价5"/>
<item id="sale_price6" desc="申卖价6"/>
<item id="sale_price7" desc="申卖价7"/>
<item id="sale_price8" desc="申卖价8"/>
<item id="sale_price9" desc="申卖价9"/>
<item id="sale_price10" desc="申卖价10"/>
<item id="buy_amount1" desc="申买量1"/>
<item id="buy_amount2" desc="申买量2"/>
<item id="buy_amount3" desc="申买量3"/>
<item id="buy_amount4" desc="申买量4"/>
<item id="buy_amount5" desc="申买量5"/>
<item id="buy_amount6" desc="申买量6"/>
<item id="buy_amount7" desc="申买量7"/>
<item id="buy_amount8" desc="申买量8"/>
<item id="buy_amount9" desc="申买量9"/>
<item id="buy_amount10" desc="申买量10"/>
<item id="sale_amount1" desc="申卖量1"/>
<item id="sale_amount2" desc="申卖量2"/>
<item id="sale_amount3" desc="申卖量3"/>
<item id="sale_amount4" desc="申卖量4"/>
<item id="sale_amount5" desc="申卖量5"/>
<item id="sale_amount6" desc="申卖量6"/>
<item id="sale_amount7" desc="申卖量7"/>
<item id="sale_amount8" desc="申卖量8"/>
<item id="sale_amount9" desc="申卖量9"/>
<item id="sale_amount10" desc="申卖量10"/>
<item id="exchange_index" desc="交易指数"/>
<item id="close_exchange_index" desc="闭市索引"/>
<item id="pre_square_price" desc="昨日结算价"/>
<item id="square_price" desc="结算价"/>
<item id="auction_price" desc="动态参考价格"/>
<item id="auction_amount" desc="虚拟匹配数量"/>
<item id="undrop_amount" desc="未平仓数量"/>
<item id="optexch_status" desc="期权交易状态"/>
<item id="opt_open_restriction" desc="期权实时开仓限制"/>
<item id="time_stamp" desc="时间戳"/>
</field>
</fields>
</ufxstep>