我正在尝试读取一个XML文件,以便对软件进行版本升级。具体地说,XML文件包含一组增量升级,这些升级可能需要将数据库更新作为SQL查询。问题是,我对读取XML文件不够熟悉,不知道如何让它正常工作。下面是XML文件的示例和我用来读取它的python (2.7)代码。
本质上,python代码将检查@release版本,如果它高于现有的软件/数据库版本,则运行SQL代码。(一旦我知道如何将SQL字符串放入变量中,我就可以很容易地添加执行查询的代码。)
有没有人能给我一些建议,我在这里可能会出错?
<?xml version="1.0"?>
<UNITNAME>
<!--Version Release-->
<databaseversion>1.0</databaseversion>
<softwareversion>2.0</softwareversion>
<released>2018-11-07</released>
<!--Database Upgrade Queries-->
<Database>
<version release="1.0">
<sql>UPDATE `system_defaults` SET `default_value`=1.0 WHERE `default_name`='DATABASEVERSION';</sql>
<sql>UPDATE `system_defaults` SET `default_value`=1.0 WHERE `default_name`='SOFTWAREVERSION';</sql>
</version>
<version release="2.0">
<sql>UPDATE `system_defaults` SET `default_value`=2.0 WHERE `default_name`='DATABASEVERSION';</sql>
<sql>UPDATE `system_defaults` SET `default_value`=2.0 WHERE `default_name`='SOFTWAREVERSION';</sql>
</version>
</Database>
</UNITNAME>python代码:变量'f‘当然是urlopen文件在互联网上的位置(它加载得很好)。
data=f.read()
f.close()
data=xmltodict.parse(data)
if isinstance(data, dict):
for k0, v0 in data["EM83D"]["Database"].iteritems():
#print k0, v0
if isinstance(v0, (list, dict)):
#print v0
for k1, v1 in v0.iteritems():
#print k1, v1
if isinstance(v1, (list, dict)):
print v1
for k2, v2 in v1.iteritems():
print k2, v2['#text']发布于 2018-11-10 08:05:45
你应该使用BeautifulSoup来完成这个任务,下面是一个如何从xml代码中获取“release”属性的例子;
from bs4 import BeautifulSoup as bs
xml = '''<?xml version="1.0"?>
<UNITNAME>
<!--Version Release-->
<databaseversion>1.0</databaseversion>
<softwareversion>2.0</softwareversion>
<released>2018-11-07</released>
<!--Database Upgrade Queries-->
<Database>
<version release="1.0">
<sql>UPDATE `system_defaults` SET `default_value`=1.0 WHERE `default_name`='DATABASEVERSION';</sql>
<sql>UPDATE `system_defaults` SET `default_value`=1.0 WHERE `default_name`='SOFTWAREVERSION';</sql>
</version>
<version release="2.0">
<sql>UPDATE `system_defaults` SET `default_value`=2.0 WHERE `default_name`='DATABASEVERSION';</sql>
<sql>UPDATE `system_defaults` SET `default_value`=2.0 WHERE `default_name`='SOFTWAREVERSION';</sql>
</version>
</Database>
</UNITNAME>'''
soup = bs(xml, 'html.parser') # or replace 'html.parser' with 'lxml' if installed (its much faster)
database_version = soup.find('databaseversion').text
software_version = soup.find('softwareversion').text
if float(software_version) > float(database_version):
sql_statements = soup.find('version', attrs={'release': float(software_version)})
for query in sql_statements.find_all('sql'):
print(query.text)
else:
print('The database does not need to be updated.')因此,如果软件版本高于数据库版本,则将打印此代码;
UPDATE `system_defaults` SET `default_value`=2.0 WHERE `default_name`='DATABASEVERSION';
UPDATE `system_defaults` SET `default_value`=2.0 WHERE `default_name`='SOFTWAREVERSION';https://stackoverflow.com/questions/53234335
复制相似问题