我正在编写一个在其文件中使用XML的应用程序配置模块。请考虑以下示例:
<?xml version="1.0" encoding="UTF-8"?>
<Settings>
<PathA>/Some/path/to/directory</PathA>
<PathB>/Another/path</PathB>
</Settings>
现在,我想覆盖之后加载的不同文件中的某些元素。覆盖文件的示例:
<?xml version="1.0" encoding="UTF-8"?>
<Settings>
<PathB>/Change/this/path</PathB>
</Settings>
使用XPath查询文档(使用覆盖)时,我想将其作为元素树:
<?xml version="1.0" encoding="UTF-8"?>
<Settings>
<PathA>/Some/path/to/directory</PathA>
<PathB>/Change/this/path</PathB>
</Settings>
这与Python的ConfigParser使用read()方法所做的类似,但是使用XML完成。我该如何实现呢?
答案 0 :(得分:1)
您可以将XML转换为Python类的实例:
import lxml.etree as ET
import io
class Settings(object):
def __init__(self,text):
root=ET.parse(io.BytesIO(text)).getroot()
self.settings=dict((elt.tag,elt.text) for elt in root.xpath('/Settings/*'))
def update(self,other):
self.settings.update(other.settings)
text='''\
<?xml version="1.0" encoding="UTF-8"?>
<Settings>
<PathA>/Some/path/to/directory</PathA>
<PathB>/Another/path</PathB>
</Settings>'''
text2='''\
<?xml version="1.0" encoding="UTF-8"?>
<Settings>
<PathB>/Change/this/path</PathB>
</Settings>'''
s=Settings(text)
s2=Settings(text2)
s.update(s2)
print(s.settings)
产量
{'PathB': '/Change/this/path', 'PathA': '/Some/path/to/directory'}
答案 1 :(得分:0)
你必须使用XML吗?使用JSON更简单可以实现同样的目的: 假设这是第一个配置文件中的文本:
text='''
{
"PathB": "/Another/path",
"PathA": "/Some/path/to/directory"
}
'''
这是第二个文本:
text2='''{
"PathB": "/Change/this/path"
}'''
然后要合并到,您只需将每个加载到dict
,然后调用update
:
import json
config=json.loads(text)
config2=json.loads(text2)
config.update(config2)
print(config)
产生Python dict
:
{u'PathB': u'/Change/this/path', u'PathA': u'/Some/path/to/directory'}