парсинг XML-файла конфигурации с использованием Etree в python - PullRequest
2 голосов
/ 18 августа 2011

Пожалуйста, помогите мне разобрать файл конфигурации нижеприведенного прототипа, используя lxml etree. Я пытался с событием, элемент с tostring. К сожалению, мне не нужен текст, но XML между

<template name> 
   <config>
 </template> 

для данного атрибута.

Я начал с этого кода, но получил ошибку ключа при поиске атрибута, так как он сканирует с начала

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>

(я отправляю этот XML с использованием httplib2 на сервер для первоначальной аутентификации)

ФИНАЛЬНЫЙ КОД:

благодаря ФК и Константину. Вот окончательный код:

    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 голос
/ 18 августа 2011

Вы можете попробовать использовать get('name', default='') вместо ['name']

Чтобы получить текст в теге, используйте .text

1 голос
/ 18 августа 2011

Вы можете попробовать перебрать все элементы template в XML и проанализировать их с помощью следующего кода:

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