python - 在 Python 中将 XML 解析为字典

标签 python xml

我有以下 xml 文件。我需要针对不同的环境自动查找/替换一堆文件中的一些字符串。我正在使用 python 2.7。我需要传递环境名称并将 xml 读入字典或数组,然后我可以使用它来查找/替换字符串。我尝试过使用 ElementTree,但不确定如何为每个环境构建包含旧/新文本的字典。请提出任何建议..

     <?xml version="1.0" encoding="utf-8" ?>
    <Config>
    <Environment env="Support">
      <sitedir path="d:\Support_463\REST Elements\Sites"/>
      <workflowdir path="d:\Support_463\REST 
    Elements\Sites\Resources\Workflows"/>
      <sitereplacements>
        <text old="zz-dev" new="zz-supp"/>
        <text old="yhz" new="vr"/>
        <text old="ax7" new="sh66^"/>
      </sitereplacements>
      <workflowreplacements>
        <text old="zz-dev" new="zz-suppx"/>
        <text old="yhsxz" new="v*&9r"/>
        <text old="ax7" new="(()&4fg"/>
      </workflowreplacements>
</Environment>
<Environment env="Test">
      <sitedir path="d:\Test_463\REST Elements\Sites"/>
      <workflowdir path="d:\Test_463\REST Elements\Sites\Resources\Workflows"/>
      <sitereplacements>
        <text old="zz-dev" new="zz-test"/>
        <text old="yhz" new="vxxAr"/>
        <text old="ax7" new="s8%6^"/>
      </sitereplacements>
      <workflowreplacements>
        <text old="zz-dev" new="zz-testx"/>
        <text old="yhsxz" new="vr"/>
        <text old="ax7" new="$%^"/>
      </workflowreplacements>
</Environment>
<!--<Environment env="Preprod">
      <sitedir path=""/>
      <workflowdir path=""/>
      <sitereplacements>
        <text old="" new=""/>
        <text old="" new=""/>
        <text old="" new=""/>
      </sitereplacements>
      <workflowreplacements>
        <text old="" new=""/>       
        <text old="" new=""/>
        <text old="" new=""/>
      </workflowreplacements>-->
</Environment>

最佳答案

将 XML 转换为字典的最简单方法是使用 xmltodict 模块。

例子:

import xmltodict
s = """<?xml version="1.0" encoding="utf-8" ?>
    <Config>
    <Environment env="Support">
      <sitedir path="d:\Support_463\REST Elements\Sites"/>
      <workflowdir path="d:\Support_463\REST 
    Elements\Sites\Resources\Workflows"/>
      <sitereplacements>
        <text old="zz-dev" new="zz-supp"/>
        <text old="yhz" new="vr"/>
        <text old="ax7" new="sh66^"/>
      </sitereplacements>
      <workflowreplacements>
        <text old="zz-dev" new="zz-suppx"/>
        <text old="yhsxz" new="v9r"/>
        <text old="ax7" new="(()4fg"/>
      </workflowreplacements>
</Environment>
<Environment env="Test">
      <sitedir path="d:\Test_463\REST Elements\Sites"/>
      <workflowdir path="d:\Test_463\REST Elements\Sites\Resources\Workflows"/>
      <sitereplacements>
        <text old="zz-dev" new="zz-test"/>
        <text old="yhz" new="vxxAr"/>
        <text old="ax7" new="s8%6^"/>
      </sitereplacements>
      <workflowreplacements>
        <text old="zz-dev" new="zz-testx"/>
        <text old="yhsxz" new="vr"/>
        <text old="ax7" new="$%^"/>
      </workflowreplacements>
</Environment>
</Config>
"""
print xmltodict.parse(s)

输出:

OrderedDict([(u'Config', OrderedDict([(u'Environment', [OrderedDict([(u'@env', u'Support'), (u'sitedir', OrderedDict([(u'@path', u'd:\\Support_463\\REST Elements\\Sites')])), (u'workflowdir', OrderedDict([(u'@path', u'd:\\Support_463\\REST      Elements\\Sites\\Resources\\Workflows')])), (u'sitereplacements', OrderedDict([(u'text', [OrderedDict([(u'@old', u'zz-dev'), (u'@new', u'zz-supp')]), OrderedDict([(u'@old', u'yhz'), (u'@new', u'vr')]), OrderedDict([(u'@old', u'ax7'), (u'@new', u'sh66^')])])])), (u'workflowreplacements', OrderedDict([(u'text', [OrderedDict([(u'@old', u'zz-dev'), (u'@new', u'zz-suppx')]), OrderedDict([(u'@old', u'yhsxz'), (u'@new', u'v9r')]), OrderedDict([(u'@old', u'ax7'), (u'@new', u'(()4fg')])])]))]), OrderedDict([(u'@env', u'Test'), (u'sitedir', OrderedDict([(u'@path', u'd:\\Test_463\\REST Elements\\Sites')])), (u'workflowdir', OrderedDict([(u'@path', u'd:\\Test_463\\REST Elements\\Sites\\Resources\\Workflows')])), (u'sitereplacements', OrderedDict([(u'text', [OrderedDict([(u'@old', u'zz-dev'), (u'@new', u'zz-test')]), OrderedDict([(u'@old', u'yhz'), (u'@new', u'vxxAr')]), OrderedDict([(u'@old', u'ax7'), (u'@new', u's8%6^')])])])), (u'workflowreplacements', OrderedDict([(u'text', [OrderedDict([(u'@old', u'zz-dev'), (u'@new', u'zz-testx')]), OrderedDict([(u'@old', u'yhsxz'), (u'@new', u'vr')]), OrderedDict([(u'@old', u'ax7'), (u'@new', u'$%^')])])]))])])]))])

关于python - 在 Python 中将 XML 解析为字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48986788/

相关文章:

Python Pandas 循环字典键(元组)并绘制变量相互关系

python - 使用 python os.fork() 可以创建多少个进程

javascript - 如何在 qweb 报告中添加分隔符?

c# - 来自 C# 的 XSLT 参数(XML 到 XML)

java - 水平居中文本

Java 创建一个新的 xml 文件并附加它

python - 代码在 Linux 上运行良好但在 OSX 上崩溃

python - Beautifulsoup 无法通过文本找到标签

python - BeautifulSoup已安装,但miniconda仍然抛出属性错误

xml - 为什么当我将 MvxBindableSpinner 放入 MvxBindableListView 时,gref 会变得太高?