Как разобрать файл XML по lxml, получить элемент и атрибут? - PullRequest
1 голос
/ 16 ноября 2011

У меня есть 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>

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

...