简体   繁体   English

使用Python将XML解析为字典

[英]Parse XML to dictionary in Python

I have the following xml file. 我有以下xml文件。 I need to automate find/replace some strings in a bunch of files for different environment. 我需要针对不同的环境自动查找/替换一堆文件中的某些字符串。 I am using python 2.7. 我正在使用python 2.7。 I need to pass the environment name and read the xml into a dictionary or array, which I can then use to find/replace the strings. 我需要传递环境名称并将xml读入字典或数组中,然后可以用它来查找/替换字符串。 I have tried using ElementTree, but unsure how to build dict containing old/new texts for each environment. 我尝试使用ElementTree,但是不确定如何为每个环境构建包含旧/新文本的字典。 Any suggestions please.. 任何建议请..

     <?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>

The simplest way to convert your XML to dictionary is by using the xmltodict module. 将XML转换为字典的最简单方法是使用xmltodict模块。

Example: 例:

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)

Output: 输出:

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'$%^')])])]))])])]))])

You can use xml.etree.ElementTree as ET. 您可以将xml.etree.ElementTree用作ET。

Check below link for more details 检查下面的链接以获取更多详细信息

https://docs.python.org/2/library/xml.etree.elementtree.html https://docs.python.org/2/library/xml.etree.elementtree.html

19.7.1.3. 19.7.1.3。 Finding interesting elements & 19.7.1.4. 寻找有趣的元素和19.7.1.4。 Modifying an XML File 修改XML文件

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM