查询:使用xml.etree解析以下xml代码?

时间:2014-05-27 14:13:10

标签: python xml python-2.7 xml.etree

问题陈述:

鉴于下面给出的xml,我想编写一个简单的脚本来生成(http)www.herp.com / (http)www.herp.com/derp 即可。可以想象,我遇到的每个应用程序路径。也就是说,如果我有更多,例如:<application path = "wassup" applicationPool="derp />,我也希望(http)www.herp.com/wassup

    <sites>
                        <site name="(http)www.herp.com" id="1" serverAutoStart="true">

                <application path="/" applicationPool="derp_administration">
                    <virtualDirectory path="/" physicalPath="D:\inetpub\herp_webs\derp" />
                    <virtualDirectory path="/Controls" physicalPath="D:\inetpub\usercontrolslibnew_ent" />
                </application>



                <application path="/derp" applicationPool="BOOGA">
                                <virtualDirectory path="/" physicalPath="D:\inetpub\herp_webs\derp" />
                                <virtualDirectory path="/Controls" physicalPath="D:\inetpub\usercontrolslibnew" />
                </application>

              </site>
        </sites>

尝试解决方案:

我使用以下代码:

import xml.etree.ElementTree as ET

tree = ET.parse("applicationHost.config")
root = tree.getroot()

sites = root.iter('site')
for site in sites: 
    print site.get('name')

然而,这显然只会给我:

(http) www.herp.com

我无法在属性中看到任何可以指向<application path = "i want this stuff" />

的内容

我尝试使用site.tag,site.text,site.attrib和site.tail,这些都没有帮助我看到构建我的网址的应用程序路径。如何解析这个xml代码以给我名称和路径属性?

所以从这里得到了很好的建议。我尝试了以下代码:

sites = root.iter('site')
for site in sites: 
    apps = site.findall('application') 
    print apps.tag, apps.attrib

我收到以下错误。

AttributeError: 'list' object has no attribute 'attrib'

标签也有类似的错误。基本上,如果我使用site.find('application')会给我第一个<application path ="/" applicationPool="whatever"/>,但我找不到它下面的其余部分。对不起。显然,我运行它的这个特定配置具有我不知道的网站依赖性。我是新工作。

研究来源

备注: 我有多个* .config文件,使用脚本解析是可行的方法。我知道一些GUI工具可以做基本的东西,但在这里不合适。

1 个答案:

答案 0 :(得分:1)

您需要获取<application> Element才能访问其path属性。给定site,您可以使用site.findall('application')

执行此操作
import xml.etree.ElementTree as ET

tree = ET.parse("applicationHost.config")
root = tree.getroot()

sites = root.iter('site')
for site in sites: 
    apps = site.findall('application')
    for app in apps:
        print(''.join([site.get('name'), app.get('path')]))

打印

(http)www.herp.com/
(http)www.herp.com/derp