【问题标题】:Python xmltodictPython xmltodict
【发布时间】:2018-11-09 23:00:12
【问题描述】:

我正在尝试读取 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']

【问题讨论】:

  • 我希望我的回答对您有所帮助,尽管我觉得您的问题有点令人困惑。您要检查哪个版本以及对照什么?你有 'databaseversion' 'softwareversion' 和两个 'version release="1.0"' 那么我们将哪个与另一个进行比较?如果这有意义

标签: python xmltodict


【解决方案1】:

你应该使用 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';

【讨论】:

  • 系统首先将databaseversion值与python中的一个值(未显示)进行匹配,然后用于确定是否需要更新数据库。假设当前正在运行数据库版本 0.0。系统检查 XML 文件并确定 1.0 是最新版本,因此更新过程脚本(如上)开始。脚本然后增量运行所有 SQL 查询,包括 1.0。我可以通过读取 发布标签信息来确定要运行的 SQL 查询部分,但无法弄清楚如何顺序读取 sql 标签中的文本来运行这些查询。
  • 我已经更新了我的答案以满足您的需求,现在我了解更多。我很乐意为您提供进一步的帮助,或者如果我回答了您的问题,请将其标记为已回答
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多