Чтение XML-файлов с помощью Petl - PullRequest
0 голосов
/ 19 сентября 2018

Я пытаюсь проанализировать информацию из файла XML в таблицу, которая уже была создана из другого файла CSV с Petl, и у меня возникают проблемы с синтаксисом функции fromxml().

XMLфайл содержит:

    <Locations>
  <qld_location>
    <Suburb>Brisbane-Central</Suburb>
    <Lat>-27.46758</Lat>
    <Long>153.027892</Long>
  </qld_location>
  <qld_location>
    <Suburb>Robertson</Suburb>
    <Lat>-27.565733</Lat>
    <Long>153.057213</Long>
  </qld_location>
  <qld_location>
    <Suburb>Logan-Village</Suburb>
    <Lat>-27.767054</Lat>
    <Long>153.116881</Long>
  </qld_location>
</Locations>

В настоящее время у меня есть таблица:

import petl as etl

table = (
        etl
            .fromcsv('QLD_Health_Care_Practices.csv')
            .convert('Practice_Name', 'upper')
            .convert('Suburb', str)
            .convert('State', str)
            .convert('Postcode', str)
    )

    +-----------------------------------+--------------------+-------+----------+
    | Practice_Name                     | Suburb             | State | Postcode |
    +===================================+====================+=======+==========+
    | 'BRISBANE CENTRE HEALTH SERVICES' | 'Brisbane-Central' | 'QLD' | '4000'   |
    +-----------------------------------+--------------------+-------+----------+
    | 'ROBERTSON FAMILY PRACTICE'       | 'Robertson'        | 'QLD' | '4109'   |
    +-----------------------------------+--------------------+-------+----------+
    | 'LOGAN VILLAGE CLINIC'            | 'Logan-Village'    | 'QLD' | '4207'   |
    +-----------------------------------+--------------------+-------+----------+
    | 'IPSWICH HEALTH CLINIC'           | 'Ipswich'          | 'QLD' | '4305'   |
    +-----------------------------------+--------------------+-------+----------+
    | 'CATTLE CREEK CLINIC'             | 'Cattle Creek'     | 'QLD' | '4407'   |
    +-----------------------------------+--------------------+-------+----------+

и я хотел бы добавить долготу и широту в новые столбцы из файла XML.

Я пытаюсь использовать функцию:

table1= (etl.fromxml('QLD_Locations.xml', 'Locations', 'qld_location', 'Suburb', 'Lat', 'Long')

, но у меня возникают проблемы с пониманием аргументов, необходимых для этого синтаксиса XML.

Любая помощь будет принята с благодарностью, заранее спасибо.

1 Ответ

0 голосов
/ 19 сентября 2018

«Плоский» список аргументов для .fromxml() работает только в том случае, если у вас также есть плоский тип структуры XML, где все столбцы данных имеют одинаковое имя:

<ROOT>
  <RECORD>
    <DATA /><DATA /><DATA /><DATA /><DATA />
  </RECORD>
</ROOT>

Это можно извлечь как

etl.fromxml('file.xml', 'RECORD', 'DATA')

Чтобы извлечь данные из более сложной структуры с различными именами столбцов или вложенностью, как у вас:

<ROOT>
  <RECORD>
    <A /><B /><C /><D /><E />
  </RECORD>
</ROOT>

Здесь вы должны явно указать каждый столбец, который вы хотите извлечь,используя dict:

etl.fromxml('file.xml', 'RECORD', {
    'Column 1': 'A',
    'Column 2': 'B',
    'Column 3': 'C',
    'Column 4': 'D',
    'Column 5': 'E',
})

Где 'A', 'B', 'C' и т. д. являются выражениями XPath относительно RECORD.

...