Как разобрать файл XML с помощью lxml, получить элемент и атрибут?

У меня есть описание xml следующим образом:

    <Car xmlns="http://example.com/vocab/xml/cars#">
     <dateStarted>{{date_started|escape}}</dateStarted>
     <dateSold>{{date_sold|escape}}</dateSold>
    <name type="{{name_type}}" abbrev="{{name_abbrev}}" value="{{name_value}}" >{{name|escape}}</name>
    <brandName type="{{brand_name_type}}" abbrev="{{brand_name_abbrev}}" value="{{brand_name_value}}" >{{brand_name|escape}}</brandName>
      <maxspeed>
        <value>{{speed_value}}</value>
        <unit type="{{speed_unit_type}}" value="{{speed_unit_value}}" abbrev="{{speed_unit_abbrev}}" />
      </maxspeed>
      <route type="{{route_type}}" value="{{route_value}}" abbrev="{{route_abbrev}}">{{by_route|escape}}</route>
      <power>
        <value>{{strength_value|escape}}</value>
        <unit type="{{strength_unit_type}}" value="{{ strength_unit_value }}" abbrev="{{ strength_unit_abbrev }}" />
      </power>
      <frequency type="{{ frequency_type }}" value="{{frequency_value}}" abbrev="{{ frequency_abbrev }}">{{frequency|escape}}</frequency>  
    </Car>

Я пишу функцию parse_car, используя Python, для анализа строки используйте приведенный выше формат:

    def parse_car(etree):
        NS = "{http://example.com/vocab/xml/cars#}"
        CODES_NS = "{http://example.com/codes/}"


        return {'date_started' : etree.findtext('%sdateStarted' % NS),
        'date_stopped' : etree.findtext('%sdateStopped' % NS),
        'name': etree.findtext('%sname' % NS),
        'brand_name': etree.findtext('%sbrandName' % NS),
        'maxspeed': etree.findtext('%smaxspeed/value' % NS),
        'maxspeed_unit': etree.findtext('%smaxspeed/value' % NS).get('abbrev'),
        'route': etree.findtext('%sroute' % NS),
        'power': etree.findtext('%spower/value' % NS),
        'power_unit': etree.find('%spower/value' % NS).get('abbrev'),
        'frequency': etree.findtext('%sfrequency' % NS) }

Но я получаю только часть результата. Вот она: остановка на маршруте:

    <Car xmlns="http://example.com/vocab/xml/cars#">
     <dateStarted>2011-02-05</dateStarted>
     <dateStopped>2011-02-13</dateStopped>         
    <name type="http://example.com/codes/bmw#" abbrev="X6" value="BMW X6" >BMW X6</name>
    <brandName type="http://example.com/codes/bmw#" abbrev="BMW" value="BMW" >BMW</brandName>
      <maxspeed>
        <value>250</value>
        <unit type="http://example.com/codes/units#" value="miles" abbrev="mph" />
      </maxspeed>
      <route type="http://...'

И вот ожидаемый конечный результат:

    <Car xmlns="http://example.com/vocab/xml/cars#">
     <dateStarted>2011-02-05</dateStarted>
     <dateSold>2011-02-13</dateSold>
    <name type="http://example.com/codes/bmw#" abbrev="X6" value="BMW X6" >BMW X6</name>
    <brandName type="http://example.com/codes/bmw#" abbrev="BMW" value="BMW">BMW</brandName>
      <maxspeed>
        <value>250</value>
        <unit type="http://example.com/codes/units#" value="miles" abbrev="mph" />
      </maxspeed>
      <route type="http://example.com/codes/routes#" abbrev="HW" value="Highway" >Highway</route>
      <power>
        <value>{{strength_value|escape}}</value>
        <unit type="http://example.com/codes/units#" value="powerhorse" abbrev="ph" />
      </power>
      <frequency type="http://example.com/codes/frequency#" value="daily" >Daily</frequency>  
    </Car>

Не могли бы вы дать мне несколько советов, почему это не работает? Я пропустил что-то здесь? Большое спасибо!


person Julie Hoberg    schedule 16.11.2011    source источник
comment
Я только что подумал об этой способности: она попадает в подэлемент скорости и не может вернуться на один уровень, поэтому не может разобрать маршрут. Это правильно? Если да, то как я могу выйти на один уровень?   -  person Julie Hoberg    schedule 16.11.2011
comment
На входе нет максимальной скорости, но она проявляется в желаемом конечном результате. Является ли опубликованный ввод неполным?   -  person unutbu    schedule 16.11.2011
comment
Моя опечатка, скопировал с оригинала и поменял.   -  person Julie Hoberg    schedule 16.11.2011
comment
'maxspeed': etree.findtext('%smaxspeed/value' % NS), 'maxspeed_unit': etree.findtext('%smaxspeed/value' % NS).get('abbrev'), правильный синтаксис или нет?   -  person Julie Hoberg    schedule 17.11.2011
comment
Ваш ввод включает двойные фигурные скобки, что наводит меня на мысль, что это может быть шаблон для механизма шаблонов, такого как jinja . Если это так, правильный способ заменить двойные фигурки значениями — используйте джиндзя.   -  person unutbu    schedule 17.11.2011
comment
findtext() возвращает строку. Строки не имеют метода get().   -  person mzjn    schedule 17.11.2011
comment
Оказывается, мне нужно только получить атрибут элемента maxspeed, как я описываю здесь: stackoverflow.com/questions/8161530/   -  person Julie Hoberg    schedule 17.11.2011