使用Python中的Etree解析XML配置文件

2 投票
2 回答
3030 浏览
提问于 2025-04-16 23:52

请帮我用lxml etree解析下面这个配置文件的原型。我尝试过用for event, element和tostring的方法。不幸的是,我不需要文本,而是需要

<template name> 
   <config>
 </template> 

某个特定属性之间的XML。

我开始写了这段代码,但在查找属性时遇到了键错误,因为它是从头开始扫描的。

config_tree = etree.iterparse(token_template_file)
for event, element in config_tree:

    if element.attrib['name']=="ad auth":
        print ("attrib reached. get XML before child ends")

由于我对XML和Python还是个新手,所以不太确定该怎么做。这里是配置文件:

<Templates>

  <template name="config1">

    <request>

      <password>pass</password>

      <userName>username</userName>

      <appID>someapp</appID>

    </request>

  </template>

  <template name="config2">

    <request>

      <password>pass1</password>

      <userName>username1</userName>

      <appID>someapp</appID>

    </request>

  </template>

</Templates>

提前谢谢你们!

期望的输出:

比如用户请求config2,那么输出应该是这样的:

   <request>

      <password>pass1</password>

      <userName>username1</userName>

      <appID>someapp</appID>

    </request>

(我通过httplib2把这个XML发送到服务器进行初始认证)

最终代码:

感谢FC和Constantnius。这里是最终的代码:

    config_tree = etree.parse(token_template_file)
    for template in config_tree.iterfind("template"):

        if template.get("name") == "config2":
            element = etree.tostring(template.find("request"))

            print (template.get("name"))
            print (element)  

输出:

     config2

    <request>

         <password>pass1</password>

          <userName>username1</userName>

          <appID>someapp</appID>

    </request>

2 个回答

1

你可以试试用 get('name', default='') 代替 ['name'] 这个写法。

如果想获取标签里的文本,可以使用 .text

1

你可以试着遍历XML中的所有template元素,然后用下面的代码来解析它们:

for template in root.iterfind("template"):
    name = template.get("name")
    request = template.find(requst)
    password = template.findtext("request/password")
    username = ...
    ...
    # Do something with the values

撰写回答