将解析后的XML文件排序为cfg-fi

2024-04-19 11:18:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用这段代码将XML文件转换为cfg文件

import sys, lxml.etree

doc = lxml.etree.parse('settings.xml')

foo = open('settings.cfg', 'w')

for el in doc.findall('setting'):
    foo.write("%s=%s\n" % (el.attrib['id'], el.attrib['value']))
foo.close() 

在我将标签写入文件之前,是否有一种方法可以对标签进行排序,并可能忽略某些标签。你知道吗

输入

<settings>
    <setting id="auto_backup" value="false" />
    <setting id="exitonbackspace" value="true" />
    <setting id="hidemousepointer" value="true" />
    <setting id="nb_backup_files" value="10" />
    <setting id="refreshonload" value="true" />
    <setting id="screen2" value="false" />
    <setting id="separator" value="" />
    <setting id="show_batch" value="true" />
    <setting id="show_log" value="true" />
</settings>

电流输出

auto_backup=false
exitonbackspace=true
hidemousepointer=true
nb_backup_files=10
refreshonload=true
screen2=false   
separator=
show_batch=true
show_log=true

需要输出

exitonbackspace=true
screen2=true
refreshonload=true
hidemousepointer=false

Tags: 文件idfalsetruesettingsfoovalueshow
2条回答

Current Output

Require Output

嗯…你的输入和当前输出似乎是按id排序的,你的“需要”输出似乎是随机的。那么,如何对您的输入进行排序,以获得所需的输出呢?我们需要安装mindreader模块吗?你知道吗

如果您的输入如下所示:

<settings>
    <setting id="hidemousepointer" value="true" />
    <setting id="show_batch" value="true" />
    <setting id="nb_backup_files" value="10" />
    <setting id="refreshonload" value="true" />
    <setting id="exitonbackspace" value="true" />
    <setting id="screen2" value="false" />
    <setting id="separator" value="" />
    <setting id="auto_backup" value="false" />
    <setting id="show_log" value="true" />
</settings>

您可以按以下id排序:

import sys, lxml.etree

doc = lxml.etree.parse('settings.xml')

elements = doc.findall('setting');
sorted_elmts = sorted(elements, key=lambda elmt: elmt.attrib['id']);

for el in sorted_elmts:
    attribs = el.attrib
    print("%s=%s" % (attribs['id'], attribs['value']))

 output: 
auto_backup=false
exitonbackspace=true
hidemousepointer=true
nb_backup_files=10
refreshonload=true
screen2=false
separator=
show_batch=true
show_log=true

为xml中找到的所有设置标记创建一个字典settings_dict。你知道吗

创建一个列表settings_order,按照您希望设置出现的顺序。你知道吗

遍历settings_order,如果settings_dict中存在元素,则可以输出它。你知道吗

import sys

try:
    from lxml import etree
except:
    import xml.etree.cElementTree as etree

doc = etree.parse('settings.xml')

settings_dict = dict([(el.attrib['id'], el) for el in doc.findall('setting')])
settings_order = ['exitonbackspace','screen2', 'refreshonload', 'hidemousepointer']

foo = open('settings.cfg', 'w')
for setting_id in settings_order:
    if setting_id in settings_dict:
        el = settings_dict[setting_id]
        foo.write("%s=%s\n" % (el.attrib['id'], el.attrib['value']))
foo.close()

相关问题 更多 >